/******/
 (function(modules) { // webpackBootstrap
/******/ 	// The module cache
/******/ 	var installedModules = {};
/******/
/******/ 	// The require function
/******/ 	function __webpack_require__(moduleId) {
/******/
/******/ 		// Check if module is in cache
/******/ 		if(installedModules[moduleId])
/******/ 			return installedModules[moduleId].exports;
/******/
/******/ 		// Create a new module (and put it into the cache)
/******/ 		var module = installedModules[moduleId] = {
/******/ 			exports: {},
/******/ 			id: moduleId,
/******/ 			loaded: false
/******/ 		};
/******/
/******/ 		// Execute the module function
/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ 		// Flag the module as loaded
/******/ 		module.loaded = true;
/******/
/******/ 		// Return the exports of the module
/******/ 		return module.exports;
/******/ 	}
/******/
/******/
/******/ 	// expose the modules object (__webpack_modules__)
/******/ 	__webpack_require__.m = modules;
/******/
/******/ 	// expose the module cache
/******/ 	__webpack_require__.c = installedModules;
/******/
/******/ 	// __webpack_public_path__
/******/ 	__webpack_require__.p = "";
/******/
/******/ 	// Load entry module and return exports
/******/ 	return __webpack_require__(0);
/******/ })
/************************************************************************/
/******/ ([
/* 0 */
/***/ function(module, exports, __webpack_require__) {

	'use strict';
	
	var _campaignDescriptionDirective = __webpack_require__(1);
	
	var _campaignDescriptionDirective2 = _interopRequireDefault(_campaignDescriptionDirective);
	
	var _campaignVideoDirective = __webpack_require__(2);
	
	var _campaignVideoDirective2 = _interopRequireDefault(_campaignVideoDirective);
	
	var _campaignPerksDirective = __webpack_require__(4);
	
	var _campaignPerksDirective2 = _interopRequireDefault(_campaignPerksDirective);
	
	var _campaignGoalDirective = __webpack_require__(6);
	
	var _campaignGoalDirective2 = _interopRequireDefault(_campaignGoalDirective);
	
	var _campaignContributeDirective = __webpack_require__(8);
	
	var _campaignContributeDirective2 = _interopRequireDefault(_campaignContributeDirective);
	
	var _campaignGoalService = __webpack_require__(10);
	
	var _campaignGoalService2 = _interopRequireDefault(_campaignGoalService);
	
	var _campaignPartnerDirective = __webpack_require__(11);
	
	var _campaignPartnerDirective2 = _interopRequireDefault(_campaignPartnerDirective);
	
	var _preOrderFundingInfoDirective = __webpack_require__(13);
	
	var _preOrderFundingInfoDirective2 = _interopRequireDefault(_preOrderFundingInfoDirective);
	
	var _campaignRecommendationsDirective = __webpack_require__(15);
	
	var _campaignRecommendationsDirective2 = _interopRequireDefault(_campaignRecommendationsDirective);
	
	var _campaignTrustPassportDesktopDirective = __webpack_require__(17);
	
	var _campaignTrustPassportDesktopDirective2 = _interopRequireDefault(_campaignTrustPassportDesktopDirective);
	
	var _mobileShareDirective = __webpack_require__(20);
	
	var _mobileShareDirective2 = _interopRequireDefault(_mobileShareDirective);
	
	var _perks = __webpack_require__(22);
	
	var _perks2 = _interopRequireDefault(_perks);
	
	function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
	
	(0, _perks2.default)(angular);
	
	angular.module('campaignPage.responsive', ['utils', 'ui.router', 'perks']).directive('campaignDescription', _campaignDescriptionDirective2.default).directive('campaignVideo', _campaignVideoDirective2.default).directive('campaignPerks', _campaignPerksDirective2.default).directive('campaignHeader', __webpack_require__(41)).directive('followMobile', __webpack_require__(43)).directive('campaignModal', __webpack_require__(45)).directive('campaignShareLinks', __webpack_require__(47)).directive('campaignTags', __webpack_require__(50)).directive('campaignTaglineStory', __webpack_require__(52)).directive('campaignPitchmedia', __webpack_require__(54)).directive('campaignTrustTeaser', __webpack_require__(56)).directive('campaignTrustPassport', __webpack_require__(58)).directive('campaignTrustPassportMobile', __webpack_require__(60)).directive('campaignContactMobile', __webpack_require__(62)).directive('campaignTrustPassportDesktop', _campaignTrustPassportDesktopDirective2.default).directive('campaignGoal', _campaignGoalDirective2.default).directive('campaignContribute', _campaignContributeDirective2.default).directive('preOrderFundingInfo', _preOrderFundingInfoDirective2.default).directive('campaignRecommendations', _campaignRecommendationsDirective2.default).directive('campaignPartner', _campaignPartnerDirective2.default).directive('mobileShare', _mobileShareDirective2.default).service('campaign', __webpack_require__(64)).service('trustPassport', __webpack_require__(65)).service('campaignGoal', _campaignGoalService2.default).run(['campaign', 'gon', '$rootScope', 'split', function (campaign, gon, $rootScope, split) {
	  if (gon && gon.campaign) {
	    var campaignPrivateJson = gon.campaignPrivateJson;
	    campaign.setCampaignJson(_.assign({}, gon.campaign, campaignPrivateJson));
	  }
	  $rootScope.split = split;
	}]);

/***/ },
/* 1 */
/***/ function(module, exports) {

	'use strict';
	
	campaignDescription.$inject = ["$http", "gon", "$sce"];
	Object.defineProperty(exports, "__esModule", {
	  value: true
	});
	/*@ngInject*/
	function campaignDescription($http, gon, $sce) {
	  return {
	    restrict: 'E',
	    scope: {},
	    template: '<div class="ugcContent" ng-bind-html="description_html"></div>',
	    link: function link(scope) {
	      scope.description_html = '';
	      $http.get(gon.urls.description_path).then(function (response) {
	        scope.description_html = $sce.trustAsHtml(response.data.response.description_html);
	      });
	    }
	  };
	}
	
	exports.default = campaignDescription;

/***/ },
/* 2 */
/***/ function(module, exports, __webpack_require__) {

	'use strict';
	
	campaignVideo.$inject = ["$sce", "youtube", "ga", "$interval", "$timeout", "froogaloop"];
	Object.defineProperty(exports, "__esModule", {
	  value: true
	});
	exports.default = campaignVideo;
	/* global YT */
	/*@ngInject*/
	function campaignVideo($sce, youtube, ga, $interval, $timeout, froogaloop) {
	  return {
	    restrict: 'E',
	    scope: {
	      id: '@'
	    },
	    template: __webpack_require__(3),
	    link: function link(scope, element, attrs) {
	      var player;
	      var vimeoReady = false;
	      var initialPlayEventRecorded;
	
	      scope.overlayUrl = attrs.overlayUrl;
	      scope.type = attrs.type;
	      scope.hideOverlay = false;
	
	      scope.vimeo_video_url = $sce.trustAsResourceUrl('//player.vimeo.com/video/' + attrs.id + '?api=1&amp;player_id=vimeoPlayer&amp;title=0&amp;byline=0&amp;portrait=0');
	
	      scope.isReadyToPlay = function () {
	        if (scope.type === 'youtube') {
	          return player && typeof player.playVideo == 'function';
	        } else if (scope.type === 'vimeo') {
	          return vimeoReady;
	        } else {
	          return false;
	        }
	      };
	
	      scope.playVideo = function () {
	        if (scope.type === 'youtube') {
	          player.playVideo();
	        } else if (scope.type === 'vimeo') {
	          player.api('play');
	        }
	      };
	
	      scope.overlayClicked = function () {
	        ga.apply(this, ['send', 'event', 'Mobile Web Campaign Page', 'Play Video']);
	
	        scope.hideOverlay = true;
	
	        var checkUntilReadyToPlay = $interval(function () {
	          if (scope.isReadyToPlay()) {
	            scope.playVideo();
	            $interval.cancel(checkUntilReadyToPlay);
	          }
	        }, 1);
	      };
	
	      if (scope.type === 'youtube') {
	        youtube.onReady(function () {
	          $timeout(function () {
	            player = new YT.Player('campaignVideo-youtube', {
	              width: '100%',
	              height: '100%',
	              videoId: scope.id,
	              playerVars: {
	                rel: 0,
	                showinfo: 0,
	                modestbranding: 1,
	                fs: 0,
	                wmode: 'opaque'
	              },
	              events: {
	                onStateChange: onYTStateChange
	              }
	            });
	          }, 0);
	        });
	      } else if (scope.type === 'vimeo') {
	        $timeout(function () {
	          player = froogaloop(element.find('#vimeoPlayer')[0]);
	          player.addEvent('ready', function () {
	            vimeoReady = true;
	            player.addEvent('pause', onVimeoPause);
	            player.addEvent('play', recordPlayEvent('vimeo'));
	          });
	        }, 0);
	      }
	
	      function onVimeoPause() {
	        player.api('getDuration', function (duration) {
	          player.api('getCurrentTime', function (timeElapsed) {
	            var percent = timeElapsed / duration;
	            if (percent > 0.99) {
	              ga.apply(this, ['send', 'event', 'Mobile Web Campaign Page', 'Video Finished', 'Vimeo']);
	            } else {
	              ga.apply(this, ['send', 'event', 'Mobile Web Campaign Page', 'Video Paused', 'Vimeo']);
	            }
	          });
	        });
	      }
	
	      function recordPlayEvent(provider) {
	        return function () {
	          if (initialPlayEventRecorded) {
	            ga.apply(this, ['send', 'event', 'Mobile Web Campaign Page', 'Video Resumed', provider]);
	          } else {
	            initialPlayEventRecorded = true;
	            ga.apply(this, ['send', 'event', 'Mobile Web Campaign Page', 'Video Playing', provider]);
	          }
	        };
	      }
	
	      function onYTStateChange(event) {
	        switch (event.data) {
	          case YT.PlayerState.PLAYING:
	            recordPlayEvent('youtube')();
	            break;
	          case YT.PlayerState.ENDED:
	            ga.apply(this, ['send', 'event', 'Mobile Web Campaign Page', 'Video Finished', 'Youtube']);
	            break;
	          case YT.PlayerState.PAUSED:
	            ga.apply(this, ['send', 'event', 'Mobile Web Campaign Page', 'Video Paused', 'Youtube']);
	            break;
	        }
	      }
	    }
	  };
	}

/***/ },
/* 3 */
/***/ function(module, exports) {

	module.exports = "<div class=\"campaignVideo-overlay\"\n  ng-if=\"overlayUrl\"\n  style=\"background-image: url({{overlayUrl}});\"\n  ng-class=\"{'hidden--animated': hideOverlay}\"\n  ng-click=\"overlayClicked()\">\n  <a class=\"campaignVideo-play\">\n    <svg><use xlink:href=\"#play\"></use></svg>\n  </a>\n</div>\n\n<!-- the YouTube API replaces the following div with an iframe -->\n<div id=\"campaignVideo-youtube\" class=\"campaignVideo-youtube\" ng-if=\"type === 'youtube'\"></div>\n\n<iframe\n  id=\"vimeoPlayer\"\n  class=\"campaignVideo-vimeo\"\n  src=\"{{vimeo_video_url}}\"\n  width=\"100%\"\n  frameborder=\"0\"\n  webkitallowfullscreen\n  mozallowfullscreen\n  allowfullscreen\n  ng-if=\"type === 'vimeo'\">\n</iframe>\n\n";

/***/ },
/* 4 */
/***/ function(module, exports, __webpack_require__) {

	'use strict';
	
	campaignPerks.$inject = ["browser", "gon", "perkFactory", "i18n", "campaign", "ga", "gogoEvents"];
	Object.defineProperty(exports, "__esModule", {
	  value: true
	});
	exports.default = campaignPerks;
	/*@ngInject*/
	function campaignPerks(browser, gon, perkFactory, i18n, campaign, ga, gogoEvents) {
	  var Perk = perkFactory;
	  return {
	    restrict: 'EA',
	    template: __webpack_require__(5),
	    link: function link(scope, element, attrs) {
	      var perks;
	      scope.showSecretPerkMessage = true;
	      scope.collapsible = browser.isMobile();
	      scope.i18n = i18n;
	      perks = _.map(campaign.perks, function (perkAttrs) {
	        return new Perk(_.merge(perkAttrs, { collapsible: scope.collapsible }), { createDropdownCountryObjects: false });
	      });
	      scope.contributionPath = gon.urls.campaign_contribution_path + '?perk_id=';
	      if (perks[0]) {
	        perks[0].expanded = true;
	      }
	      scope.perks = perks;
	      scope.campaign = campaign;
	      scope.secretPerkStatus = gon.secret_perk_status;
	
	      if (scope.perks.some(function (perk) {
	        return perk.secret;
	      })) {
	        // TODO EVENTS: id=aim2g fixtype=ga+captureEvent category=Campaign.Page action=View.load.with.Secret.Perk name=campaign_page_view_load_with_secret_perk vars=project_id subsystem=campaign-page . review
	        ga('send', 'event', 'Campaign Page', 'View load with Secret Perk');
	        gogoEvents.captureEvent('campaign_page_view_load_with_secret_perk', { project_id: scope.campaign.id });
	      }
	
	      scope.hideSecretPerkMessage = function () {
	        scope.showSecretPerkMessage = false;
	      };
	    }
	  };
	}

/***/ },
/* 5 */
/***/ function(module, exports) {

	module.exports = "<div ng-if=\"collapsible\">\n  <campaign-trust-teaser></campaign-trust-teaser>\n  <campaign-trust-passport></campaign-trust-passport>\n</div>\n\n<h2 ng-if=\"perks.length > 0 && !campaign.isInDemand()\"\n  class=\"i-perks-header i-campaign-section-header\">\n  {{::i18n.t('select_perk')}}\n</h2>\n\n<div ng-if=\"perks.length > 0 && campaign.isInDemand() && !campaign.is_pre_order_campaign\"\n  class=\"i-perks-header i-campaign-section-header i-campaign-section-header--slim\">\n</div>\n\n<div class=\"secretPerk-hidden am-collapse\" ng-if=\"secretPerkStatus && showSecretPerkMessage\">\n  <span ng-if=\"secretPerkStatus === 'hidden'\">{{::i18n.t('secret_perk.hidden')}}</span>\n  <span ng-if=\"secretPerkStatus === 'unavailable'\">{{::i18n.t('secret_perk.unavailable')}}</span>\n  <svg-icon icon=\"icon-icon-close\" class=\"secretPerk-hidden-close\" ng-click=\"hideSecretPerkMessage()\"></svg-icon>\n</div>\n\n<div ng-repeat=\"perk in perks\" class=\"perkItem-campaignPerkContainer\">\n  <split ng-if=\"!perk.sold_out\" experiment=\"campaign_page_share_perks\" variant=\"experiment\">\n    <perk-share-banner></perk-share-banner>\n  </split>\n  <perk perk=\"::perk\" class=\"highlight-on-hover\" cta-link=\"{{contributionPath + perk.id}}\"\n        shipping-now-campaign=\"campaign.is_shipping_now_campaign\"\n        preorder-perk-campaign=\"campaign.is_pre_order_campaign\"\n        invalid-yet-live-campaign=\"campaign.funding_invalid_yet_live\"\n        indemand-campaign=\"campaign.isInDemand()\"\n        all-funding-expired=\"campaign.all_funding_expired\"\n        tech-design-restyled-campaign=\"campaign.isTechDesignRestyled()\">\n    <perk-title></perk-title>\n    <perk-description></perk-description>\n    <ships-to-countries ng-if=\"perk.hasShippingObject()\"\n                        label-text=\"{{::i18n.t('contribution_flow.line_items.ships_to')}}\"\n                        option-perk=\"::perk\"\n                        desktop-and-more=\"HOVER\"\n                        mobile-and-more=\"CLICK\"\n                        class=\"perkItem-shipsTo\"></ships-to-countries>\n  </perk>\n</div>\n";

/***/ },
/* 6 */
/***/ function(module, exports, __webpack_require__) {

	'use strict';
	
	campaignGoalDirective.$inject = ["$filter", "campaign", "i18n", "$sce", "campaignGoal"];
	Object.defineProperty(exports, "__esModule", {
	  value: true
	});
	exports.default = campaignGoalDirective;
	/*@ngInject*/
	function campaignGoalDirective($filter, campaign, i18n, $sce, campaignGoal) {
	  return {
	    restrict: 'E',
	    template: __webpack_require__(7),
	    link: function link(scope) {
	      scope.i18n = i18n;
	      scope.campaign = campaign;
	      scope.campaignGoal = campaignGoal;
	
	      scope.fundingEndsAt = function () {
	        if (!campaign.funding_ends_at) return null;
	        return moment(campaign.funding_ends_at).format('MMMM D, YYYY');
	      };
	
	      scope.fundsRaisedDays = function () {
	        var fsa = moment(campaign.funding_started_at);
	        var fea = moment.min(moment(campaign.funding_ends_at), moment());
	        var raisedText = fsa.to(fea);
	        return $sce.trustAsHtml(raisedText.replace(/(\d+)/, function (match, $1) {
	          return '<em>' + $1 + '</em>';
	        }));
	      };
	
	      scope.percentFunded = function () {
	        return campaignGoal.percentFundedString() + ' ' + 'of' + ' ' + $filter('iggCurrency')(campaign.goal, campaign.currency.iso_num, 'noIso');
	      };
	    }
	  };
	}

/***/ },
/* 7 */
/***/ function(module, exports) {

	module.exports = "<div ng-if=\"campaignGoal.showsTechDesignRestyled()\">\n  <div class=\"campaignGoalTech\">\n    <span class=\"campaignGoalTech-fundsAmount\"\n          ng-bind-html=\"campaign.forever_funding_combined_balance | iggCurrency : campaign.currency.iso_num : 'html'\">\n  </span>\n    <div class=\"campaignGoalTech-bar\">\n      <div class=\"campaignGoalTech-barProgressFill\"\n           ng-style=\"{width: campaignGoal.progressBarWidth() + '%'}\">\n      </div>\n    </div>\n    <div class=\"campaignGoalTech-percent\">\n      {{percentFunded()}} <span igg-popover placement=\"top\" text=\"{{campaignGoal.fundingTypeGoalString()}}\" class=\"campaignGoalTech-percentType\">{{campaignGoal.fundingBlurb()}}</span>\n    </div>\n    <div class=\"campaignGoalTech-backers\">\n      {{campaign.contributions_count | number : 0}} {{campaignGoal.stringForNumberOfFunders()}}\n    </div>\n    <div class=\"campaignGoalTech-remaining\" ng-bind-html=\"campaignGoal.fundsDaysRemaining()\"></div>\n  </div>\n</div>\n<div ng-if=\"!campaignGoal.showsTechDesignRestyled()\">\n  <div class=\"campaignGoal-standardContainer\">\n    <div class=\"campaignGoal-funds\">\n      <span class=\"campaignGoal-fundsAmount\"\n           ng-bind-html=\"campaign.forever_funding_combined_balance | iggCurrency : campaign.currency.iso_num : 'html'\">\n      </span>\n      <div class=\"campaignGoal-fundsRaisedDaysAndBackers\">\n        {{i18n.t('raised')}}\n        <span class=\"campaignGoal-fundsRaisedBackers\" ng-if=\"campaign.state() === campaign.states.ended\">{{i18n.t('by')}}\n          <em>{{campaign.contributions_count | number : 0}} {{campaignGoal.stringForNumberOfFunders()}}</em>\n        </span>\n        <span class=\"campaignGoal-fundsRaisedDays\" ng-bind-html=\"fundsRaisedDays()\"></span>\n      </div>\n\n      <span class=\"campaignGoal-fundsRaisedGoal\"> {{i18n.t('raised_of')}}\n         <span class=\"numeral\">{{campaign.goal | iggCurrency : campaign.currency.iso_num : null}}</span>\n      </span>\n      <div class=\"campaignGoal-bar\">\n        <div class=\"campaignGoal-barProgressFill\" ng-style=\"{width: campaignGoal.progressBarWidth() + '%'}\"></div>\n      </div>\n    </div>\n    <div class=\"campaignGoal-barMeta\">\n      <div class=\"campaignGoal-barMetaFunding\" ng-bind-html=\"campaignGoal.percentFundedHtml()\"></div>\n      <div class=\"campaignGoal-barMetaRemaining\" ng-bind-html=\"campaignGoal.fundsDaysRemaining()\"></div>\n      <div class=\"campaignGoal-barMetaBackers\"><em>{{campaign.contributions_count | number : 0}}</em> {{campaignGoal.stringForNumberOfFunders()}}</div>\n    </div>\n    <div class=\"campaignGoal-footer\">\n      <div class=\"campaignGoal-verifiedNonProfit\" ng-if=\"campaign.nonprofit\">\n        <div class=\"campaignGoal-verifiedNonProfitIcon\">\n          <svg-icon icon=\"icon-icon-charity\"></svg-icon>\n        </div>\n        <div class=\"campaignGoal-verifiedNonProfitText\">{{::i18n.t('verified_nonprofit')}}</div>\n      </div>\n      <div class=\"campaignGoal-goal\">\n        <div class=\"campaignGoal-goalIcon\">\n          <svg-icon icon=\"icon-icon-create-goal\"></svg-icon>\n        </div>\n        <div class=\"campaignGoal-goalMeta\">\n          <div class=\"campaignGoal-goalAmountContainer\">\n            <span class=\"campaignGoal-goalAmount\" ng-bind-html=\"campaign.goal | iggCurrency: campaign.currency.iso_num : 'html'\"></span>\n            {{i18n.t('goal').toLowerCase()}}\n          </div>\n          <div class=\"campaignGoal-goalFundingType\">\n              <span class='i-status'>{{campaignGoal.fundingType()}}</span>\n              <span igg-popover placement=\"top\" popover-icon=\"icon-icon-info\" style=\"display: none;\">{{campaignGoal.fundingBlurb()}}</span>\n            </div>\n        </div>\n      </div>\n      <div class=\"campaignGoal-closed\" ng-if=\"campaign.state() === campaign.states.ended\">\n        <div class='i-contribute-button i-campaign-closed'>\n          {{i18n.t('campaign_closed')}}\n          <div ng-if=\"fundingEndsAt()\" class=\"i-campaign-closed-subheader\">\n            {{i18n.t('this_campaign_ended_on_date', {date: fundingEndsAt()})}}\n          </div>\n        </div>\n      </div>\n\n    </div>\n  </div>\n</div>\n";

/***/ },
/* 8 */
/***/ function(module, exports, __webpack_require__) {

	'use strict';
	
	campaignContribute.$inject = ["campaign", "campaignGoal", "i18n", "gon", "browser"];
	Object.defineProperty(exports, "__esModule", {
	  value: true
	});
	exports.default = campaignContribute;
	/*@ngInject*/
	function campaignContribute(campaign, campaignGoal, i18n, gon, browser) {
	  return {
	    restrict: 'E',
	    template: __webpack_require__(9),
	    link: function link(scope) {
	      scope.campaign = campaign;
	      scope.campaignGoal = campaignGoal;
	      scope.campaignContributionPath = null;
	
	      if (browser.isMobile()) {
	        scope.campaignContributionPath = gon.urls.campaign_contribution_path;
	      } else {
	        scope.campaignContributionPath = gon.urls.desktop_campaign_contribution_path;
	      }
	
	      scope.inDemandCTA = function () {
	        if (campaign.perks_available && !gon.pay_flow_split_test) {
	          return i18n.t('select_perk');
	        } else {
	          return i18n.t('contribute_now');
	        }
	      };
	
	      scope.showInDemandCTA = function () {
	        return !(scope.campaign.isInDemand() && scope.campaign.perks_available);
	      };
	
	      scope.showCTA = function () {
	        return campaign.visible && (campaign.state() === campaign.states.published || campaign.state() === campaign.states.inDemand) && !campaign.funding_invalid_yet_live && !campaignGoal.showsTechDesignRestyled() && scope.showInDemandCTA();
	      };
	    }
	  };
	}

/***/ },
/* 9 */
/***/ function(module, exports) {

	module.exports = "\n<div ng-if=\"campaign.funding_invalid_yet_live\">\n  <div class=\"i-cta-1 i-cta-1--disabled i-contribute-button\">Contribute Now</div>\n  {{::i18n.t('funding_options_invalid.mobile_contribute_subheader')}}\n</div>\n\n<div class=\"desktop-cta-section\" ng-if=\"showCTA()\" ng-class=\"{'desktop-cta-section--ff': campaign.isInDemand()}\">\n  <div early-contribute\n       currency-symbol=\"{{campaign.currency.symbol}}\"\n       base-contribute-path='{{campaignContributionPath}}'></div>\n  <div class='i-contrib-logo'></div>\n</div>\n<div class=\"mobile-cta-section\">\n  <div\n    ng-if=\"campaign.state() === campaign.states.draft\"\n    class=\"i-campaign-funding-call-to-action i-cta-1 i-cta-1--50px i-cta-1--fullWidth i-cta-1--disabled\"\n    disabled>\n    {{ i18n.t('contribute_now') }}\n  </div>\n\n  <a\n    ng-if=\"showCTA()\"\n    class=\"i-campaign-funding-call-to-action i-cta-1 i-cta-1--50px i-cta-1--fullWidth\"\n    href=\"{{campaignContributionPath}}\"\n    ga-event-on=\"click\"\n    ga-event-category=\"Mobile Web Campaign Page\"\n    ga-event-action=\"Tap Contribute Now Button\"\n    ga-event-label=\"Campaign Page\"\n    ng-click=\"finished('responsive_campaign_page')\">\n    {{ i18n.t('contribute_now') }}\n  </a>\n\n  <a\n    ng-if=\"campaign.state() === campaign.states.inDemand &&\n        !campaign.funding_invalid_yet_live &&\n        showInDemandCTA()\"\n    class=\"i-campaign-funding-call-to-action i-cta-1 i-cta-1--50px i-cta-1--fullWidth\"\n    ng-href=\"{{campaignContributionPath}}\"\n    ga-event-on=\"click\"\n    ga-event-category=\"Mobile Web Campaign Page\"\n    ga-event-action=\"Tap Contribute Now Button\"\n    ga-event-label=\"Campaign Page\"\n    ng-click=\"finished('responsive_campaign_page'); scrollToPerksIfPreOrder()\">\n    {{ inDemandCTA() }}\n  </a>\n\n  <div\n    ng-if=\"campaign.state() === campaign.states.ended\"\n    class=\"i-campaign-funding-ended\">\n    <span class=\"i-campaign-funding-ended-upper\">{{::i18n.t(\"closed\")}}</span>\n  <span class=\"i-dont-break\">\n    {{ campaignGoal.onDateText(campaign.funding_ends_at) }}\n  </span>\n  </div>\n\n  <split experiment=\"campaign_page_mobile_share\" variant=\"contribute_button_below_fb_only\">\n    <mobile-share></mobile-share>\n  </split>\n\n  <div\n    ng-if=\"campaign.state() !== campaign.states.inDemandEnded\"\n    class=\"campaignContribute-fundingBlurb\">\n    <em>{{campaignGoal.fundingType()}}:</em> {{campaignGoal.fundingBlurb()}}\n  </div>\n</div>\n";

/***/ },
/* 10 */
/***/ function(module, exports) {

	'use strict';
	
	campaignGoalService.$inject = ["i18n", "campaign", "$filter", "$sce", "browser"];
	Object.defineProperty(exports, "__esModule", {
	  value: true
	});
	exports.default = campaignGoalService;
	/* jshint expr: true */
	/*@ngInject*/
	function campaignGoalService(i18n, campaign, $filter, $sce, browser) {
	  return {
	    showsTechDesignRestyled: function showsTechDesignRestyled() {
	      return campaign.isTechDesignEligible() && browser.isTabletPlus();
	    },
	    fundingBlurb: function fundingBlurb() {
	      var goalReached = campaign.collected_funds >= campaign.goal;
	
	      if (campaign.state() === campaign.states.ended && goalReached) {
	        return i18n.t('flex_or_fixed_hit_goal_expired_blurb');
	      }
	
	      if (campaign.state() === campaign.states.ended) {
	        // Goal is not reached
	        if (campaign.funding_type === 'fixed') {
	          return i18n.t('fixed_didnt_hit_goal_expired_blurb', {
	            agent_show_goal: $filter('iggCurrency')(campaign.goal, campaign.currency.iso_num, null)
	          });
	        } else if (campaign.funding_type === 'flexible') {
	          return i18n.t('flex_or_fixed_hit_goal_expired_blurb');
	        }
	      } else {
	        if (campaign.funding_type === 'fixed') {
	          if (goalReached) {
	            return i18n.t('fixed_campaign_hit_goal_still_funding_blurb');
	          } else {
	            return i18n.t('fixed_still_funding_hasnt_hit_goal_blurb', {
	              agent_show_goal: $filter('iggCurrency')(campaign.goal, campaign.currency.iso_num, null)
	            });
	          }
	        } else if (campaign.funding_type === 'flexible') {
	          return i18n.t('flex_campaign_still_funding_blurb');
	        }
	      }
	    },
	    fundingType: function fundingType() {
	      return {
	        fixed: i18n.t("fixed_funding"),
	        flexible: i18n.t("flexible_funding")
	      }[campaign.funding_type];
	    },
	    fundingTypeGoalString: function fundingTypeGoalString() {
	      return {
	        fixed: i18n.t("fixed_goal"),
	        flexible: i18n.t("flexible_goal")
	      }[campaign.funding_type];
	    },
	    onDateText: function onDateText(date) {
	      var formattedDate = $filter('date')(date, 'MMMM d, yyyy');
	      return i18n.t('on_date', { date: formattedDate });
	    },
	    stringForNumberOfFunders: function stringForNumberOfFunders() {
	      return campaign.contributions_count == 1 ? i18n.t("project_card.backer") : i18n.t("project_card.backers");
	    },
	    fundsDaysRemaining: function fundsDaysRemaining() {
	      var timeDiff = moment(campaign.funding_ends_at).diff();
	      var timeRemaining = moment.duration(timeDiff);
	
	      function remainingText() {
	        if (i18n.locale === 'en') {
	          return '&nbsp;left';
	        } else {
	          return '';
	        }
	      }
	
	      if (timeDiff < 0) {
	        return i18n.t('no_time_left_html');
	      } else {
	        return $sce.trustAsHtml(timeRemaining.humanize().replace(/(\d+)/, function (match, $1) {
	          return '<em>' + $1 + '</em>';
	        }) + remainingText());
	      }
	    },
	    percentFunded: function percentFunded() {
	      return campaign.goal === 0 ? 0 : campaign.collected_funds / campaign.goal * 100;
	    },
	    percentFundedString: function percentFundedString() {
	      return $filter('number')(this.percentFunded(), 0) + '%';
	    },
	    percentFundedHtml: function percentFundedHtml() {
	      return $sce.trustAsHtml('<em>' + this.percentFundedString() + '</em> ' + i18n.t('funded'));
	    },
	    progressBarWidth: function progressBarWidth() {
	      var percent = this.percentFunded();
	      if (0 < percent && percent < 5) {
	        return 2;
	      } else {
	        var nearest_5_percent = Math.floor(percent / 5) * 5;
	        return Math.min(100, nearest_5_percent);
	      }
	    },
	    foreverFundingBlurb: function foreverFundingBlurb() {
	      var blurb;
	      if (campaign.is_external_campaign) {
	        var display_end_date = new Date(campaign.external_campaign_info.external_end_date);
	
	        blurb = i18n.t("funded_on_another_platform_on", {
	          "date": $filter('date')(display_end_date, 'MMMM d, yyyy')
	        });
	      } else {
	        blurb = i18n.t("percent_funded_on_end_date", {
	          "percent": this.percentFundedString(),
	          "end_date": $filter('date')(campaign.funding_ends_at, 'MMMM D, yyyy')
	        });
	      }
	      return blurb;
	    }
	  };
	}

/***/ },
/* 11 */
/***/ function(module, exports, __webpack_require__) {

	'use strict';
	
	campaignPartner.$inject = ["i18n", "campaign"];
	Object.defineProperty(exports, "__esModule", {
	  value: true
	});
	exports.default = campaignPartner;
	/*@ngInject*/
	function campaignPartner(i18n, campaign) {
	  return {
	    restrict: 'E',
	    template: __webpack_require__(12),
	    link: function link(scope) {
	      var partner = campaign.partner;
	      scope.i18n = i18n;
	      scope.partner = partner;
	      scope.squareLogo = partner.square_logo_image_url ? partner.square_logo_image_url : partner.square_logo_missing_image_url;
	    }
	  };
	}

/***/ },
/* 12 */
/***/ function(module, exports) {

	module.exports = "  <div class=\"i-sidebar-header\">{{::i18n.t('in_partnership_with')}}</div>\n  <div class=\"i-musty-background i-padded-block-20\">\n    <div class=\"i-image-media i-partner-image-media\">\n      <img ng-src=\"{{squareLogo}}\"/>\n      <a ng-href=\"{{partner.path}}\">{{partner.name}}</a>\n    </div>\n  </div>\n";

/***/ },
/* 13 */
/***/ function(module, exports, __webpack_require__) {

	'use strict';
	
	preOrderFundingInfoDirective.$inject = ["$filter", "i18n", "campaign", "currencyDisplayFilter", "_"];
	Object.defineProperty(exports, "__esModule", {
	  value: true
	});
	exports.default = preOrderFundingInfoDirective;
	/*@ngInject*/
	
	function preOrderFundingInfoDirective($filter, i18n, campaign, currencyDisplayFilter, _) {
	  return {
	    scope: {},
	    restrict: 'E',
	    template: __webpack_require__(14),
	    link: function link(scope) {
	      scope.i18n = i18n;
	      scope.currency = currencyDisplayFilter;
	      scope.iggCurrency = $filter('iggCurrency');
	      scope.campaign = campaign;
	
	      function featuredFbFriend() {
	        var featuredFriend = _.sample(campaign.facebook_friend_contributors);
	
	        if (featuredFriend) {
	          var imgUrl = featuredFriend.avatar_url.split("width=200")[0] + 'type=square';
	          featuredFriend.avatar_url = imgUrl;
	          return featuredFriend;
	        }
	      }
	
	      scope.featuredFbFriend = featuredFbFriend();
	
	      function percentFunded() {
	        if (campaign.is_external_campaign) {
	          return campaign.external_campaign_info.percentage_raised;
	        } else if (campaign.goal === 0) {
	          return 0;
	        } else {
	          return campaign.collected_funds / campaign.goal * 100;
	        }
	      }
	
	      function foreverFundingBlurb() {
	        var display_end_date;
	        display_end_date = new Date(campaign.funding_ends_at);
	
	        if (campaign.is_external_campaign) {
	          display_end_date = new Date(campaign.external_campaign_info.external_end_date);
	        }
	
	        return i18n.t("percent_funded_on_end_date", {
	          "percent": Math.round(percentFunded()) + '%',
	          "end_date": $filter('date')(display_end_date, 'MMMM d, yyyy')
	        });
	      }
	
	      scope.foreverFundingBlurb = foreverFundingBlurb();
	
	      function popoverBlurb() {
	        if (campaign.is_external_campaign) {
	          return i18n.t("funders_originally_pledged_on_another_platform", {
	            "funders": campaign.external_campaign_info.number_of_funders,
	            "funds_raised": $filter('iggCurrency')(campaign.external_campaign_info.funds_raised, campaign.currency.iso_num)
	          });
	        }
	      }
	
	      scope.popoverBlurb = popoverBlurb();
	
	      function dateText(date) {
	        var formattedDate = $filter('date')(date, 'MMMM d, yyyy');
	        return i18n.t('on_date', { date: formattedDate });
	      }
	
	      scope.dateText = dateText;
	    }
	  };
	}

/***/ },
/* 14 */
/***/ function(module, exports) {

	module.exports = "<div ng-if=\"campaign.state() !== campaign.states.inDemandEnded\"\n     class=\"preOrder-fundingInfoBox\">\n  <div class=\"preOrder-indemandLabel\">{{::i18n.t('in_demand_label')}}</div>\n  <div class=\"preOrder-combinedBalance\">\n    <div ng-bind-html=\"campaign.forever_funding_combined_balance | iggCurrency : campaign.currency.iso_num : 'html'\">\n    </div>\n  </div>\n  <div class=\"preOrder-combinedBalanceLabel\">\n    {{::i18n.t('total_funds_raised')}}\n  </div>\n\n  <div class=\"indemandSidebar-banner\">\n    <div class=\"preOrder-banner-header\">\n      {{campaign.is_shipping_now_campaign ? i18n.t('pre_order_page.shipping_now') : i18n.t('in_demand_label')}}\n    </div>\n    {{::foreverFundingBlurb}}\n    <span ng-if=\"campaign.is_external_campaign\" class=\"indemandSidebar-link\" igg-popover placement=\"top\" popover-icon=\"icon-icon-info\">\n      {{::popoverBlurb}}\n    </span>\n  </div>\n  <div class=\"indemandSidebar-bannerFold\"></div>\n\n  <div class=\"preOrder-fundingBlurb\">\n    {{::foreverFundingBlurb}}\n  </div>\n\n\n  <div ng-if=\"campaign.nonprofit\" class=\"i-icon-project-note\">\n    <svg><use xlink:href=\"#icon-icon-charity\"></use></svg>\n    <span class=\"i-note\">{{::i18n.t('verified_nonprofit')}}</span>\n  </div>\n\n  <div ng-if=\"featuredFbFriend\" class=\"project-card-friend-list\">\n    <img alt=\"Picture?type=square\" ng-src=\"{{featuredFbFriend.avatar_url}}\">\n    <span class=\"i-facebook-name\">\n      <a ng-href=\"/individuals/{{::featuredFbFriend.id}}\">{{::featuredFbFriend.firstname}}</a>\n      {{::i18n.t('has_funded')}}\n    </span>\n  </div>\n</div>\n<div ng-if=\"campaign.state() === campaign.states.inDemandEnded\"\n     class=\"preOrder-fundingInfoBox\">\n  <div class=\"preOrder-indemandLabel-closed \">{{::i18n.t('in_demand_label')}}</div>\n  <div class=\"preOrder-combinedBalance\">\n    <div ng-bind-html=\"campaign.forever_funding_combined_balance | iggCurrency : campaign.currency.iso_num : 'html'\">\n    </div>\n  </div>\n  <div class=\"preOrder-combinedBalanceLabel\">\n    {{::i18n.t('total_funds_raised')}}\n  </div>\n  <div class=\"indemandSidebar-closed\">\n    <svg-icon icon=\"icon-icon-check\"></svg-icon>\n    <div class=\"indemandSidebar-closed-textSection\">\n      {{::foreverFundingBlurb}}\n    </div>\n    <div class='i-contribute-button i-campaign-closed'>\n      {{i18n.t('closed')}}\n    </div>\n  </div>\n</div>\n";

/***/ },
/* 15 */
/***/ function(module, exports, __webpack_require__) {

	'use strict';
	
	campaignRecommendations.$inject = ["gon", "split", "$http"];
	Object.defineProperty(exports, "__esModule", {
	  value: true
	});
	exports.default = campaignRecommendations;
	/*@ngInject*/
	function campaignRecommendations(gon, split, $http) {
	  return {
	    restrict: 'E',
	    scope: {},
	    template: __webpack_require__(16),
	    link: function link($scope) {
	      $scope.campaigns = [];
	      var currentVariant = null;
	      split.fetchVariantState('recos_on_projects').then(function (variant) {
	        currentVariant = variant;
	        return $http.get(gon.urls.campaign_recommendations, { params: { variant: variant } });
	      }).then(function (_ref) {
	        var campaigns = _ref.data.campaigns;
	
	        $scope.campaigns = campaigns;
	      });
	
	      $scope.projectPath = function (campaign) {
	        var iggRef = currentVariant === 'control' ? null : currentVariant;
	        return iggRef ? campaign.url.concat('/', iggRef) : campaign.url;
	      };
	    }
	  };
	}

/***/ },
/* 16 */
/***/ function(module, exports) {

	module.exports = "\n  <div class=\"i-header\" ng-if=\"campaigns.length > 0\"><i18n>{{::i18n.t('recommendations.other_campaigns_you_might_like')}}</i18n></div>\n  <carousel objects=\"campaigns\" window=\"visibleCampaigns\" visible=\"4\">\n    <ul class=\"row\">\n      <li project-card-discovery-www ng-repeat=\"campaign in visibleCampaigns\" ng-animate=\"'animate'\" campaign=\"campaign\" project-path=\"projectPath(campaign)\">\n      </li>\n    </ul>\n  </carousel>\n";

/***/ },
/* 17 */
/***/ function(module, exports, __webpack_require__) {

	'use strict';
	
	campaignTrustPassportDesktop.$inject = ["i18n", "$http", "gon", "vcRecaptchaService", "trustPassport", "$modal"];
	Object.defineProperty(exports, "__esModule", {
	  value: true
	});
	exports.default = campaignTrustPassportDesktop;
	/* @ngInject */
	function campaignTrustPassportDesktop(i18n, $http, gon, vcRecaptchaService, trustPassport, $modal) {
	  return {
	    scope: {},
	    template: __webpack_require__(18),
	    link: function link(scope) {
	      scope.i18n = i18n;
	      scope.project = trustPassport.project;
	      scope.owner = trustPassport.owner;
	      scope.hasVerifications = trustPassport.hasVerifications;
	      scope.idVerifiedEnabled = trustPassport.idVerifiedEnabled;
	      scope.loggedIn = trustPassport.loggedIn;
	      scope.loginUrl = trustPassport.loginUrl;
	      scope.hasWebsites = trustPassport.websites.length > 0;
	      scope.websites = [];
	
	      var websiteGaAction = function websiteGaAction(url) {
	        var urlMatcher = new RegExp('(.+)\\..+');
	        var domain = urlMatcher.exec(url)[1];
	        var gaActions = {
	          'facebook': 'FBPage',
	          'twitter': 'Twitter',
	          'youtube': 'Youtube',
	          'imdb': 'IMDb'
	        };
	
	        var gaAction = gaActions[domain];
	        return gaAction || 'Website';
	      };
	
	      _.each(trustPassport.websites, function (website) {
	        scope.websites.push(_.merge(website, { gaAction: websiteGaAction(website.text) }));
	      });
	
	      _.each(scope.project.team_members, function (teamMember) {
	        var verifications = trustPassport.getVerificationsForTeamMember(teamMember, scope.idVerifiedEnabled);
	        teamMember.hasVerification = _.any(verifications);
	      });
	
	      scope.currentView = 'project';
	      scope.firstName = scope.owner.name.split(' ')[0];
	      scope.messageFailed = false;
	      scope.message = {
	        text: ''
	      };
	      scope.helpCenterUrl = _.clone(gon.trust_passport.help_center_url);
	      scope.grecaptcha_site_key = gon.trust_passport.grecaptcha_site_key;
	
	      var recaptchaId = null;
	      var contactOwnerEndpointUrl = _.clone(gon.trust_passport.contact_owner_endpoint_url);
	      var passportModal = null;
	      var recaptchaSuccess = false;
	
	      scope.openModal = function (view) {
	        scope.setView(view);
	        passportModal = $modal({ template: __webpack_require__(19), scope: scope });
	      };
	
	      scope.closeModal = function () {
	        passportModal.hide();
	      };
	
	      scope.setView = function (view) {
	        scope.currentView = view;
	      };
	
	      scope.setReCaptchaSuccess = function () {
	        recaptchaSuccess = true;
	      };
	
	      scope.sendMessageDisabled = function () {
	        return !(scope.message.text.length > 0 && trustPassport.isRecaptchaReadyForId(recaptchaId) && recaptchaSuccess);
	      };
	
	      scope.setReCaptchaReady = function (widgetId) {
	        recaptchaId = widgetId;
	        trustPassport.registerRecaptchaId(widgetId);
	      };
	
	      scope.sendMessage = function () {
	        var captchaResponse = null;
	
	        if (trustPassport.isRecaptchaReadyForId(recaptchaId)) {
	          captchaResponse = vcRecaptchaService.getResponse(recaptchaId);
	        } else {
	          captchaResponse = true;
	        }
	
	        $http.post(contactOwnerEndpointUrl, { comment: { text: scope.message.text }, grecaptcha: captchaResponse }).then(function () {
	          scope.setView('message-sent');
	          scope.message.text = '';
	          scope.messageFailed = false;
	        }, function () {
	          scope.messageFailed = true;
	        }).finally(function () {
	          if (trustPassport.isRecaptchaReadyForId(recaptchaId)) {
	            vcRecaptchaService.reload();
	          }
	        });
	      };
	    }
	  };
	}

/***/ },
/* 18 */
/***/ function(module, exports) {

	module.exports = "<div class=\"campaignTrustPassport-desktop-links\">\n  <a href=\"\" class=\"campaignTrustPassportDesktop-linkContact\" ng-if=\"loggedIn\" ng-click=\"openModal('contact')\"\n     analytics-on=\"click\"\n     analytics-name=\"trust_contact_teaser_click\"\n     analytics-category=\"Trust\"\n     analytics-event=\"ContactTeaser\"\n  >{{::i18n.t('contact')}}</a>\n  <a href=\"\" class=\"campaignTrustPassportDesktop-linkContact\" ng-if=\"!loggedIn\" ng-href=\"{{loginUrl}}\" >{{::i18n.t('contact')}}</a>\n\n  <span class=\"campaignTrustPassport-middot campaignTrustPassport-actionMiddot\">&bullet;</span>\n  <a href=\"\" class=\"campaignTrustPassportDesktop-linkSeeMoreDetails\" ng-click=\"openModal('project')\"\n     analytics-on=\"click\"\n     analytics-name=\"trust_see_more_details_click\"\n     analytics-category=\"Trust\"\n     analytics-event=\"Modal\"\n  >{{::i18n.t('trust_passport.see_more_details')}}</a>\n</div>\n";

/***/ },
/* 19 */
/***/ function(module, exports) {

	module.exports = "<div class=\"modal campaignSuperModal campaignTrustPassportDesktop-modal\">\n  <div class=\"modal-dialog\">\n    <div class=\"modal-content\">\n      <div class=\"campaignSuperModal-header\">\n        <div ng-show=\"currentView == 'project'\">\n          <div class=\"campaignSuperModal-title\">\n            {{i18n.t('trust_passport.about_something', {something: project.title})}}\n          </div>\n          <div>\n            <span ng-if=\"project.category\">{{::i18n.t(project.category.slug)}}</span>\n            <span class=\"campaignTrustPassport-middot\">&bullet;</span>\n            {{project.location}}\n          </div>\n        </div>\n\n        <div ng-show=\"currentView == 'contact' || currentView == 'message-sent'\">\n          <div class=\"campaignSuperModal-title\">{{::i18n.t('contact')}}</div>\n          <div>{{i18n.t('trust_passport.campaign_owner_will_be_able_to_reply_directly', {owner: firstName})}}</div>\n        </div>\n        <div class=\"modal-close campaignSuperModal-close\" ng-click=\"closeModal()\"><svg><use xlink:href=\"#icon-icon-close\"></use></svg></div>\n      </div>\n\n      <div class=\"campaignTrustPassportDesktop-columns\">\n        <div class=\"campaignTrustPassportDesktop-columnLeft campaignSuperModal-body\">\n          <div class=\"campaignTrustPassportDesktop-section\">\n            <img class=\"campaignTrustPassportDesktop-ownerAvatar\" ng-src=\"{{owner.avatar_url}}\" />\n            <div class=\"campaignTrustPassportDesktop-ownerInfo\">\n              <h3>{{owner.name}}</h3>\n              <div>{{owner.role}}</div>\n              <div>\n                <a href=\"\" ng-click=\"setView('contact')\" ng-if=\"loggedIn && currentView !== 'contact'\"\n                   analytics-on=\"click\"\n                   analytics-name=\"trust_contact_modal_click\"\n                   analytics-category=\"Trust\"\n                   analytics-event=\"ContactModal\">\n                  {{::i18n.t('contact')}}\n                </a>\n                <a href=\"\" ng-href=\"{{loginUrl}}\" ng-if=\"!loggedIn && currentView !== 'contact'\">{{::i18n.t('contact')}}</a>\n                <span class=\"campaignTrustPassport-middot campaignTrustPassport-actionMiddot\" ng-if=\"currentView !== 'contact'\">&bullet;</span>\n                <a target=\"blank\" ng-href=\"{{owner.profile_url}}\"\n                   analytics-on=\"click\"\n                   analytics-name=\"trust_profile_click\"\n                   analytics-category=\"Trust\"\n                   analytics-event=\"Profile\">\n                  {{::i18n.t('trust_passport.see_full_profile')}}\n                </a>\n              </div>\n            </div>\n          </div>\n\n          <div class=\"campaignTrustPassportDesktop-section\" ng-if=\"owner.description.length > 0\">\n            <h3>{{i18n.t('trust_passport.about_something', {something: firstName})}}</h3>\n            <div>{{owner.description}}</div>\n          </div>\n\n          <div class=\"campaignTrustPassportDesktop-section campaignTrustPassportDesktop-verifications\" ng-if=\"hasVerifications\">\n            <h3>{{::i18n.t('verifications')}}</h3>\n            <div class=\"campaignTrustPassportDesktop-verification\" ng-if=\"owner.admin_verified && idVerifiedEnabled\">\n              <svg><use xlink:href=\"#icon-icon-check\"></use></svg>\n              <span igg-popover placement=\"top\" text=\"{{::i18n.t('trust_passport.identity_verified')}}\">\n                {{::i18n.t('trust_passport.identity_popover')}}\n              </span>\n            </div>\n            <div class=\"campaignTrustPassportDesktop-verification\" ng-if=\"owner.email_verified\">\n              <svg><use xlink:href=\"#icon-icon-mail\"></use></svg>\n              <span>{{::i18n.t('email_verified')}}</span>\n            </div>\n            <div class=\"campaignTrustPassportDesktop-verification campaignTrustPassportDesktop-verification--facebook\" ng-if=\"owner.facebook_verified\">\n              <svg><use xlink:href=\"#icon-icon-facebook\"></use></svg>\n              <a target=\"blank\" ng-href=\"{{owner.facebook_profile_url}}\" ng-if=\"owner.facebook_profile_url\"\n                 analytics-on=\"click\"\n                 analytics-name=\"trust_fb_profile_click\"\n                 analytics-category=\"Trust\"\n                 analytics-event=\"FBProfile\">\n                {{i18n.t('facebook_friends', {count: owner.facebook_friends_count})}}\n              </a>\n              <span ng-if=\"!owner.facebook_profile_url\">\n                {{i18n.t('facebook_friends', {count: owner.facebook_friends_count})}}\n              </span>\n            </div>\n            <div class=\"campaignTrustPassportDesktop-verification campaignTrustPassportDesktop-verification--linkedin\" ng-if=\"owner.linkedin_verified\">\n              <svg><use xlink:href=\"#icon-icon-linkedin\"></use></svg>\n              <a target=\"blank\" ng-href=\"{{owner.linkedin_profile_url}}\"\n                 analytics-on=\"click\"\n                 analytics-name=\"trust_linkedin_profile_click\"\n                 analytics-category=\"Trust\"\n                 analytics-event=\"LinkedInProfile\">\n                 {{::i18n.t('linkedin_verified')}}\n              </a>\n            </div>\n          </div>\n\n          <div class=\"campaignTrustPassportDesktop-section\">\n            <h3>{{::i18n.t('trust_passport.impact')}}</h3>\n            <div ng-if=\"owner.campaigns_count > 0\">\n              {{i18n.t('trust_passport.campaigns_created', {count: owner.campaigns_count})}}\n            </div>\n            <div ng-if=\"owner.contributions_count > 0\">\n              {{i18n.t('trust_passport.contributions_made', {count: owner.contributions_count})}}\n            </div>\n            <div ng-if=\"owner.comments_count > 0\">\n              {{i18n.t('trust_passport.comments_made', {count: owner.comments_count})}}\n            </div>\n          </div>\n        </div>\n\n        <div class=\"campaignTrustPassportDesktop-columnRight campaignSuperModal-body\">\n          <div ng-show=\"currentView == 'project'\">\n            <div class=\"campaignTrustPassportDesktop-section\">\n              <div class=\"campaignTrustPassportDesktop-recentActivityIcon\">\n                <svg><use xlink:href=\"#icon-icon-recent-activity\"></use></svg>\n              </div>\n              <div class=\"campaignTrustPassportDesktop-recentActivityInfo\">\n                <h3>{{::i18n.t('trust_passport.recent_activity')}}</h3>\n                <div>{{project.activity}}</div>\n              </div>\n            </div>\n            <div class=\"campaignTrustPassportDesktop-section\">\n              <h3 class=\"campaignTrustPassportDesktop-teamCount\">{{i18n.t('team_members', {count: project.team_members.length}).toLowerCase()}}</h3>\n              <div class=\"campaignTrustPassportDesktop-teamMembers\">\n                <div class=\"campaignTrustPassportDesktop-teamMember\" ng-repeat=\"member in project.team_members\">\n                  <div class=\"campaignTrustPassportDesktop-memberAvatar\">\n                    <img ng-src=\"{{member.avatar_url}}\" />\n                  </div>\n                  <div class=\"campaignTrustPassportDesktop-memberInfo\">\n                    <a ng-href=\"{{member.profile_url}}\" target=\"_blank\"\n                       analytics-on=\"click\"\n                       analytics-name=\"trust_team_profile_click\"\n                       analytics-category=\"Trust\"\n                       analytics-event=\"TeamProfile\">\n                      {{member.name}}\n                    </a>\n                    <div>{{member.role}}</div>\n                  </div>\n                  <span class=\"campaignTrustPassportDesktop-memberVerifications\" igg-popover popover-icon=\"icon-icon-id\" placement=\"top\" ng-if=\"member.hasVerification\">\n                    <p>{{::i18n.t('verifications')}}</p>\n                    <div class=\"campaignTrustPassportDesktop-memberVerifications-icons\">\n                      <svg><use xlink:href=\"#icon-icon-check\" ng-if=\"member.admin_verified && idVerifiedEnabled\"></use></svg>\n                      <svg><use xlink:href=\"#icon-icon-mail\" ng-if=\"member.email_verified\"></use></svg>\n                      <svg class=\"facebook\"><use xlink:href=\"#icon-icon-facebook\" ng-if=\"member.facebook_verified\"></use></svg>\n                      <svg class=\"linkedin\"><use xlink:href=\"#icon-icon-linkedin\" ng-if=\"member.linkedin_verified\"></use></svg>\n                    </div>\n                  </span>\n                </div>\n              </div>\n            </div>\n            <div class=\"campaignTrustPassportDesktop-section campaignTrustPassportDesktop-websites\" ng-if=\"hasWebsites\">\n              <h3>{{::i18n.t('websites')}}</h3>\n              <a target=\"blank\" class=\"campaignTrustPassportDesktop-website\" ng-repeat=\"website in websites\" ng-href=\"{{website.url}}\"\n                 analytics-on=\"click\"\n                 analytics-name=\"trust_{{website.gaAction}}_click\"\n                 analytics-category=\"Trust\"\n                 analytics-event=\"{{website.gaAction}}\">\n                {{website.text}}\n              </a>\n            </div>\n            <div class=\"campaignTrustPassportDesktop-section\" ng-if=\"project.bank_account_country\">\n              <h3>{{::i18n.t('bank_account_country')}}</h3>\n              <div>{{project.bank_account_country}}</div>\n            </div>\n            <div class=\"campaignTrustPassportDesktop-section campaignTrustPassportDesktop-helpCenter\">\n              {{::i18n.t('trust_passport.help_center_text')}}\n              <a ng-href=\"{{helpCenterUrl}}\"\n                 analytics-on=\"click\"\n                 analytics-name=\"trust_help_click\"\n                 analytics-category=\"Trust\"\n                 analytics-event=\"TrustHelp\">\n                {{::i18n.t('learn_more')}}\n              </a>\n            </div>\n          </div>\n\n          <div ng-show=\"currentView == 'contact'\">\n            <div class=\"campaignTrustPassportDesktop-section\" ng-if=\"messageFailed\">\n              <div class=\"messageNotification messageNotification--error\">\n                <div class=\"messageNotification-header\">{{::i18n.t('trust_passport.sorry_somethings_wrong_on_our_end')}}</div>\n                {{::i18n.t('trust_passport.try_sending_your_message_in_a_few_minutes')}}\n              </div>\n            </div>\n            <div class=\"campaignTrustPassportDesktop-section\">\n              <div class=\"campaignTrustPassportDesktop-contact-message\">\n                <textarea ng-model=\"message.text\" maxlength=\"500\"></textarea>\n                <div class=\"campaignTrustPassportDesktop-contact-charCounter\">{{message.text | charCounter:500}}</div>\n              </div>\n            </div>\n            <div class=\"campaignTrustPassportDesktop-section\">\n              <div class=\"campaignTrustPassportDesktop-contact-submitMessage\">\n                <div class=\"g-recaptcha\" vc-recaptcha key=\"grecaptcha_site_key\"\n                     on-create=\"setReCaptchaReady(widgetId)\"\n                     on-success=\"setReCaptchaSuccess(response)\"\n                ></div>\n                <button class=\"i-cta-1\" ng-disabled=\"sendMessageDisabled()\"\n                        ng-click=\"sendMessage()\"\n                        analytics-on=\"click\"\n                        analytics-name=\"trust_contact_send_click\"\n                        analytics-category=\"Trust\"\n                        analytics-event=\"ContactSend\">\n                  {{::i18n.t('send_message')}}\n                </button>\n              </div>\n            </div>\n          </div>\n\n          <div class=\"campaignTrustPassportDesktop-section\" ng-show=\"currentView == 'message-sent'\">\n            <div class=\"messageNotification messageNotification--success\">\n              <div class=\"messageNotification-header\">{{::i18n.t('trust_passport.your_message_has_been_sent')}}</div>\n              {{::i18n.t('trust_passport.the_campaign_owner_has_received_your_message')}}\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n";

/***/ },
/* 20 */
/***/ function(module, exports, __webpack_require__) {

	'use strict';
	
	mobileShare.$inject = ["gon", "ga", "gogoEvents", "i18n", "fb"];
	Object.defineProperty(exports, "__esModule", {
	  value: true
	});
	exports.default = mobileShare;
	/*@ngInject*/
	function mobileShare(gon, ga, gogoEvents, i18n, fb) {
	  return {
	    restrict: 'E',
	    scope: {},
	    template: __webpack_require__(21),
	    link: function link(scope) {
	      var analyticsOptions = {
	        page_location: 'mobile_campaign'
	      };
	
	      scope.i18n = i18n;
	
	      scope.shareFacebook = function () {
	        var options = gon.current_account ? { account_id: gon.current_account.account_id } : {};
	        options.utm_query_string = gon.fb_utm_query_string;
	        fb.share(gon.share.canonical_url, options).then(function () {
	          ga('send', 'event', 'campaign_page_share', 'click_fb_share_mobile_successful', gon.ga_impression_data.category);
	          gogoEvents.captureEvent('click_fb_share_mobile_successful', analyticsOptions);
	        });
	        ga('send', 'event', 'campaign_page_share', 'click_fb_share_mobile', gon.ga_impression_data.category);
	        gogoEvents.captureEvent('click_fb_share_mobile', analyticsOptions);
	      };
	    }
	  };
	}

/***/ },
/* 21 */
/***/ function(module, exports) {

	module.exports = "<div ng-click=\"shareFacebook()\" class=\"campaignContribute-fbOnly\">\n  <div class=\"campaignContribute-fbOnly-label\">\n    <div class=\"campaignContribute-fbOnly-icon\">\n      <svg-icon icon=\"icon-icon-facebook\"></svg-icon>\n    </div>\n    <div class=\"campaignContribute-fbOnly-text\">\n      {{i18n.t('mobile.share_this_campaign')}}\n    </div>\n  </div>\n</div>\n";

/***/ },
/* 22 */
/***/ function(module, exports, __webpack_require__) {

	'use strict';
	
	Object.defineProperty(exports, "__esModule", {
	  value: true
	});
	exports.default = perks;
	
	var _perkCalloutLabelDirective = __webpack_require__(23);
	
	var _perkCalloutLabelDirective2 = _interopRequireDefault(_perkCalloutLabelDirective);
	
	var _perkDirectives = __webpack_require__(24);
	
	var _perkDirectives2 = _interopRequireDefault(_perkDirectives);
	
	var _perkFactory = __webpack_require__(33);
	
	var _perkFactory2 = _interopRequireDefault(_perkFactory);
	
	var _perkFromGonUsingIdService = __webpack_require__(34);
	
	var _perkFromGonUsingIdService2 = _interopRequireDefault(_perkFromGonUsingIdService);
	
	var _perkShareBannerDirective = __webpack_require__(35);
	
	var _perkShareBannerDirective2 = _interopRequireDefault(_perkShareBannerDirective);
	
	var _perkStoreCardDirective = __webpack_require__(37);
	
	var _perkStoreCardDirective2 = _interopRequireDefault(_perkStoreCardDirective);
	
	var _shipsToCountriesDirective = __webpack_require__(39);
	
	var _shipsToCountriesDirective2 = _interopRequireDefault(_shipsToCountriesDirective);
	
	function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
	
	function perks(angular) {
	  var perkModule = angular.module('perks', ['utils']);
	  (0, _perkDirectives2.default)(perkModule);
	  perkModule.directive('perkCalloutLabel', _perkCalloutLabelDirective2.default).factory('perkFactory', _perkFactory2.default).factory('perkFromGonUsingId', _perkFromGonUsingIdService2.default).directive('perkStoreCard', _perkStoreCardDirective2.default).directive('perkShareBanner', _perkShareBannerDirective2.default).directive('shipsToCountries', _shipsToCountriesDirective2.default);
	}

/***/ },
/* 23 */
/***/ function(module, exports) {

	'use strict';
	
	perkCalloutLabel.$inject = ["i18n", "$log", "perkFromGonUsingId"];
	Object.defineProperty(exports, "__esModule", {
	  value: true
	});
	exports.default = perkCalloutLabel;
	/*@ngInject*/
	function perkCalloutLabel(i18n, $log, perkFromGonUsingId) {
	  return {
	    restrict: 'E',
	    scope: {},
	    replace: false,
	    template: '<div ng-if="perk.has_callout_label" class="highlight bold fr top_perk i-top-perk">{{::perk.callout_label}}</div>',
	    link: function link(scope, element, attrs, nullController, transclude) {
	      if (attrs.optionPerk) {
	        scope.perk = attrs.optionPerk;
	      } else if (attrs.optionPerkId) {
	        scope.perk = perkFromGonUsingId(attrs.optionPerkId);
	      }
	    }
	  };
	}

/***/ },
/* 24 */
/***/ function(module, exports, __webpack_require__) {

	'use strict';
	
	perk.$inject = ["browser", "i18n", "countriesService", "gon", "$templateCache", "ga", "gogoEvents"];
	perkDescription.$inject = ["i18n", "gon"];
	Object.defineProperty(exports, "__esModule", {
	  value: true
	});
	exports.default = perkDirectives;
	/*@ngInject*/
	function perk(browser, i18n, countriesService, gon, $templateCache, ga, gogoEvents) {
	
	  return {
	    restrict: 'E',
	    scope: {
	      perk: '=',
	      ctaLink: '@',
	      forModals: '=',
	      shippingNowCampaign: '=?',
	      preorderPerkCampaign: '=',
	      invalidYetLiveCampaign: '=',
	      indemandCampaign: '=',
	      allFundingExpired: '=',
	      techDesignRestyledCampaign: '='
	    },
	    transclude: true,
	    template: __webpack_require__(25),
	    link: function link(scope, element, attrs) {
	      var perkFormModal;
	      var confirmPerkDeleteModal;
	      var hostname = gon.campaign && gon.campaign.url_hostname ? gon.campaign.url_hostname : null;
	
	      function openEditModal() {
	        if (scope.forModals) {
	          perkFormModal = scope.forModals.modal({
	            scope: new scope.forModals.perkFormScope(scope.$new(), scope.perk, scope.forModals.campaign, scope.forModals.currentUser, hostname),
	            template: __webpack_require__(26)
	          });
	        }
	      }
	
	      function confirmDeleteModal() {
	        if (scope.forModals) {
	          var scopeForDeleteModal = scope;
	          scopeForDeleteModal.campaign = scope.forModals.campaign;
	
	          confirmPerkDeleteModal = scope.forModals.modal({
	            scope: scopeForDeleteModal,
	            template: __webpack_require__(27)
	          });
	        }
	      }
	
	      scope.$on('perkUpdated', function (event, updatedPerk) {
	        if (scope.perk.id === updatedPerk.id) {
	          _.merge(scope.perk, updatedPerk);
	          perkFormModal.hide();
	        }
	      });
	
	      scope.$on('perkDeleted', function () {
	        if (confirmPerkDeleteModal) {
	          confirmPerkDeleteModal.hide();
	        }
	      });
	
	      scope.openEditModal = openEditModal;
	      scope.confirmDeleteModal = confirmDeleteModal;
	
	      scope.shouldShowCtaLink = function () {
	        return !scope.invalidYetLiveCampaign && scope.ctaLink && (scope.preorderPerkCampaign || scope.shippingNowCampaign || scope.indemandCampaign || scope.techDesignRestyledCampaign || scope.perk.expanded && !browser.isTabletPlus()) && !scope.allFundingExpired;
	      };
	
	      function currency() {
	        if (gon.campaign) {
	          return gon.campaign.currency;
	        }
	        if (gon.contribution) {
	          return gon.contribution.currency;
	        }
	      }
	
	      function clickPerkAction() {
	        if (!scope.perk.sold_out && !scope.allFundingExpired) {
	          if (scope.perk.collapsible) {
	            scope.perk.expanded = !scope.perk.expanded;
	          } else if (scope.ctaLink && !scope.invalidYetLiveCampaign) {
	            // track secret perk clicks from the campaign page (goes into contribution flow)
	            if (scope.perk.secret && scope.ctaLink.indexOf("contributions/new") >= 0) {
	              // TODO EVENTS: id=buy7o subsystem=campaign-page fixtype=ga+captureEvent category=Campaign.Page action=Click.Secret.Perk name=campaign_page_click_secret_perk vars=project_id . combine
	              ga('send', 'event', 'Campaign Page', 'Click Secret Perk');
	              gogoEvents.captureEvent('campaign_page_click_secret_perk', { project_id: scope.perk.agent_id });
	            }
	            browser.redirectTo(scope.ctaLink);
	          }
	        }
	      }
	
	      function perkBtnTxt() {
	        if (scope.shippingNowCampaign || scope.perk.shipping_now) {
	          return i18n.t('pre_order_page.buy_now');
	        } else {
	          return i18n.t('contribution_flow.get_this_perk');
	        }
	      }
	
	      scope.i18n = i18n;
	      scope.countries = countriesService;
	      scope.isShippingLabelDisplayed = scope.perk.isShippingLabelDisplayed();
	      scope.currency = currency();
	      scope.clickPerkAction = clickPerkAction;
	      scope.perkBtnTxt = perkBtnTxt();
	    }
	  };
	}
	
	function perkChange() {
	  return {
	    restrict: 'E',
	    template: __webpack_require__(28)
	  };
	}
	
	function perkTitle() {
	  return {
	    restrict: 'E',
	    template: __webpack_require__(29),
	    transclude: true
	  };
	}
	
	/*@ngInject*/
	function perkDescription(i18n, gon) {
	  return {
	    restrict: 'E',
	    template: __webpack_require__(30),
	    link: function link(scope) {
	      function perksClaimed() {
	        var numClaimed = scope.perk.number_claimed || 0;
	        if (scope.perk.number_available) {
	          return i18n.t('x_out_of_y_claimed_html', {
	            x: numClaimed,
	            y: scope.perk.number_available,
	            count: numClaimed
	          });
	        } else {
	          return i18n.t('x_claimed_html', {
	            number_claimed: numClaimed,
	            count: numClaimed
	          });
	        }
	      }
	      function currency() {
	        if (gon.campaign) {
	          return gon.campaign.currency;
	        }
	        if (gon.contribution) {
	          return gon.contribution.currency;
	        }
	      }
	      function non_tax_deductible_amount_with_currency() {
	        return currency().symbol + scope.perk.non_tax_deductible_amount;
	      }
	      function tax_deductible_message() {
	        if (!_.isNumber(scope.perk.non_tax_deductible_amount)) {
	          return "";
	        }
	        if (scope.perk.non_tax_deductible_amount > 0) {
	          return i18n.t('amount_over_x_is_tax_deductible', { non_tax_deductible_amount: non_tax_deductible_amount_with_currency() });
	        } else {
	          return i18n.t('fully_tax_deductible');
	        }
	      }
	
	      scope.perksClaimed = perksClaimed;
	      scope.tax_deductible_message = tax_deductible_message;
	      scope.i18n = i18n;
	    }
	  };
	}
	
	function amountWithCurrency() {
	  return {
	    restrict: 'E',
	    template: __webpack_require__(31)
	  };
	}
	
	function perkDiscount() {
	  return {
	    restrict: 'E',
	    template: __webpack_require__(32),
	    link: function perkDiscountLink(scope) {
	      function calculateDiscount(perk) {
	        perk = perk || scope.perk;
	        return perk.retail_amount && Math.floor((perk.retail_amount - perk.amount) / perk.retail_amount * 100);
	      }
	      scope.discountPercent = calculateDiscount();
	
	      scope.$on('perkUpdated', function (event, updatedPerk) {
	        if (updatedPerk.id == scope.perk.id) {
	          scope.discountPercent = calculateDiscount(updatedPerk);
	        }
	      });
	    }
	  };
	}
	
	function perkDirectives(perkModule) {
	  perkModule.directive('perk', ['browser', 'i18n', 'countriesService', 'gon', '$templateCache', 'ga', 'gogoEvents', perk]).directive('perkChange', perkChange).directive('perkTitle', perkTitle).directive('perkDescription', ['i18n', 'gon', perkDescription]).directive('amountWithCurrency', [amountWithCurrency]).directive('perkDiscount', [perkDiscount]);
	}

/***/ },
/* 25 */
/***/ function(module, exports) {

	module.exports = "<div class=\"perkItem open\" ng-disabled=\"perk.sold_out || allFundingExpired\" ng-click=\"clickPerkAction()\" ng-class=\"{ 'perkItem--secretPerk' : perk.secret }\">\n  <div class=\"perkImageColumn\">\n    <div class=\"perkImageWrapper\">\n      <div class=\"perkImageOverlay\"></div>\n      <img ng-if=\"perk.perk_image_public_id\" class=\"perkImage\"\n           cl-image width=\"304\" height=\"230\" crop=\"fill\"\n           public-id=\"perk.perk_image_public_id\" alt=\"{{i18n.t('upload_an_image')}}\"/>\n    </div>\n  </div>\n  <div class=\"perkItem-contributewrap clearfix\">\n    <div class=\"i-perk-expand-toggle pull-right\" ng-if=\"perk.collapsible\">\n      <svg class=\"dropdownIcon\" ng-class=\"{open: perk.expanded}\"><use xlink:href=\"#down-caret\"></use></svg>\n    </div>\n\n    <div ng-if=\"perk.sold_out\" class=\"i-soldout-mask\">\n      <span class=\"i-text\">{{::i18n.t('sold_out')}}</span>\n    </div>\n\n    <div ng-class=\"{ 'secretPerk-banner' : true, 'secretPerk-banner-soldOut' : perk.sold_out }\" ng-if=\"perk.secret\">\n      <svg-icon icon=\"icon-icon-shades\" class=\"secretPerk-shades\"></svg-icon>\n      <span class=\"secretPerk-bannerText\">\n        {{::i18n.t('secret_perk.secret_perk')}}\n      </span>\n      <div ng-class=\"{ 'secretPerk-bannerFold' : true, 'secretPerk-bannerFold-soldOut' : perk.sold_out }\"></div>\n    </div>\n\n    <div class=\"editPerkOverlay\" ng-if=\"forModals\" ng-click=\"openEditModal()\">\n      <div ng-click=\"confirmDeleteModal(); $event.stopPropagation();\" class=\"miniBtnAction miniBtnAction--delete miniBtnAction--deleteExp miniBtnTopRight\">\n        <svg><use xlink:href=\"#icon-icon-close\"></use></svg>\n      </div>\n      <span class=\"i-cta-2 i-cta-2-white i-cta-2-white--noHover\">{{ ::i18n.t('edit_details') }}</span>\n    </div>\n\n    <div ng-if=\"perk.has_callout_label\"\n         class=\"highlight bold top_perk i-top-perk perkItem-topPerk\">\n      {{::perk.callout_label}}\n    </div>\n    <amount-with-currency></amount-with-currency>\n    <perk-discount></perk-discount>\n    <div ng-transclude></div>\n    <div class=\"perkItem-getThisPerkButtonWrapper\" ng-if=\"shouldShowCtaLink()\">\n      <a ng-href=\"{{ctaLink}}\" class=\"i-cta-1 perkItem-getThisPerkButton\">\n        {{::perkBtnTxt}}\n      </a>\n    </div>\n  </div>\n</div>\n";

/***/ },
/* 26 */
/***/ function(module, exports) {

	module.exports = "<div class=\"modal i-modal i-perk-form-modal\">\n  <div class=\"modal-dialog\">\n    <div class=\"modal-content\" ng-form=\"perkForm\">\n\n      <div ng-if=\"!campaign.isPreOrderCampaign\" ng-include src=\"'views/perk-form-regular.html'\"></div>\n      <perk-form-pre-order ng-if=\"campaign.isPreOrderCampaign\"></perk-form-pre-order>\n\n      <div class=\"i-button-row\">\n        <button type=\"button\" class=\"i-cta-1 i-cta-1--grey\" id=\"btn-cancel\"\n                ng-click=\"$hide()\">\n          {{::i18n.t('campaign_editor.buttons.cancel')}}\n        </button>\n        <button type=\"submit\" type=\"button\" class=\"i-cta-1\" id=\"btn-confirm\"\n                ng-click=\"savePerk(perkForm)\" ng-disabled=\"perkForm.$invalid\">\n          {{::i18n.t('campaign_editor.buttons.save')}}\n        </button>\n      </div>\n    </div>\n  </div>\n</div>\n";

/***/ },
/* 27 */
/***/ function(module, exports) {

	module.exports = "<div class=\"modal i-modal\">\n  <div class=\"modal-dialog dialog\">\n    <div class=\"modal-content perkDeleteModal\">\n      <div class=\"perkDeleteModalText\">\n        <div class=\"perkDeleteModal-heading\">{{::i18n.t('campaign_editor.perks.confirm_perk_removal', { perk_label : perk.label })}}</div>\n        <div class=\"perkDeleteModal-subheading\">{{::i18n.t('campaign_editor.misc.confirm_prompt')}}</div>\n      </div>\n      <div class=\"i-button-row perkDeleteModal-buttonRow\">\n        <div class=\"i-cta-1 i-cta-1--grey\" ng-click=\"$hide()\">\n          {{::i18n.t('cancel')}}\n        </div>\n        <div class=\"i-cta-1 perkDeleteModal-buttonRow-confirmDelete\" ng-click=\"perk.deletePerk(campaign.id)\">\n          {{::i18n.t('campaign_editor.buttons.remove_perk')}}\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n";

/***/ },
/* 28 */
/***/ function(module, exports) {

	module.exports = "<a href=\"\" class=\"perkItem-changePerkLink\">\n  {{::i18n.t('contribution_flow.change_perk')}}\n</a>\n";

/***/ },
/* 29 */
/***/ function(module, exports) {

	module.exports = "<div class=\"perkItem-title\">\n  {{perk.label}}\n  <span ng-transclude></span>\n</div>\n";

/***/ },
/* 30 */
/***/ function(module, exports) {

	module.exports = "<div>\n  <div class=\"perkItem-description\" ng-if=\"!perk.collapsible || perk.expanded\">{{perk.description}}</div>\n  <div class=\"perkItem-tax-info\" ng-if=\"perk.use_non_tax_deductible_amount\">\n    {{tax_deductible_message()}}\n  </div>\n  <span class=\"perkItem-lineItem-label availability\" ng-bind-html=\"perksClaimed()\"></span>\n  <div ng-if=\"perk.estimated_delivery_date\">\n    <span class=\"perkItem-lineItem-label\">{{::i18n.t('contribution_flow.line_items.estimated_delivery')}}</span>\n    <span class=\"perkItem-lineItem-value\">{{perk.estimated_delivery_date | date:'MMMM yyyy'}}</span>\n  </div>\n</div>\n";

/***/ },
/* 31 */
/***/ function(module, exports) {

	module.exports = "<span class=\"perkItem-perkAmount\">{{currency.symbol}}{{perk.amount}}</span>\n<span class=\"perkItem-currencyAndLabeling\">{{currency.iso_code}}\n  <span ng-if=\"isShippingLabelDisplayed\"> + {{::i18n.t('contribution_flow.shipping')}}</span>\n</span>\n";

/***/ },
/* 32 */
/***/ function(module, exports) {

	module.exports = "<div class=\"perkItem-discount\" ng-if=\"discountPercent\">\n  <span class=\"perkItem-retailAmount\">{{perk.retail_amount| currency:currency.symbol:0}}</span>\n  ({{discountPercent}}{{i18n.t('pre_order_page.percent_off')}})\n</div>\n";

/***/ },
/* 33 */
/***/ function(module, exports) {

	"use strict";
	
	PerkFactory.$inject = ["$http", "$rootScope", "_", "countriesService", "i18n", "$log", "gon"];
	var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol ? "symbol" : typeof obj; };
	
	Object.defineProperty(exports, "__esModule", {
	  value: true
	});
	exports.default = PerkFactory;
	/*@ngInject*/
	function PerkFactory($http, $rootScope, _, countriesService, i18n, $log, gon) {
	  var countries = countriesService;
	
	  /**
	   * TODO: list attributes explicitly as function arguments, rather than a single argument with docs
	   * @param attributes
	   *  REQUIRED
	   *    amount: positive int
	   *    label: string at most 30 long
	   *    description: string at most 500 long
	   *  OPTIONAL
	   *    number_available: positive int, null = unlimited i think
	   *    estimated_delivery_date:
	   *    shipping_address_required: true/false
	   *    retail_amount: positive int
	   *    perk_image_public_id: string
	   *    pre_orderable: true/false
	   *    shipping: object of form:
	   *       { fees: { <countrycode>: <fee> },
	   *         is_free_everywhere: true/false }
	   * @constructor
	   */
	
	  function syncShippingFees(perkAttributes) {
	    var hasShippingDotFees, hasShippingObj, hasShippingUnderscoreFees, updatedShippingDotFees, difference;
	    var self = perkAttributes ? perkAttributes : this;
	    self.wasShippingSetByDefault = false;
	
	    hasShippingObj = _.isObject(self.shipping);
	    hasShippingUnderscoreFees = _.isObject(self.shipping_fees);
	
	    if (hasShippingObj) {
	      hasShippingDotFees = _.isObject(self.shipping.fees);
	    } else {
	      self.shipping = { fees: {} };
	    }
	
	    // If it DOES HAVE shipping.fees
	    // but DOES NOT HAVE shipping_fees,
	    // build shipping_fees.
	    if (hasShippingDotFees && !hasShippingUnderscoreFees) {
	      var shipKeys = Object.keys(self.shipping.fees);
	      var updatedShippingUnderscoreFees = [];
	      _.each(shipKeys, function (shipKey) {
	        var shipFee = {};
	        shipFee.country_code = shipKey;
	        shipFee.fee = self.shipping.fees[shipKey];
	        updatedShippingUnderscoreFees.push(shipFee);
	      });
	      self.shipping_fees = updatedShippingUnderscoreFees;
	    }
	
	    // If it DOES NOT HAVE shipping.fees
	    // but DOES HAVE shipping_fees,
	    // build shipping.fees.
	    if (!hasShippingDotFees && hasShippingUnderscoreFees) {
	      updatedShippingDotFees = {};
	      _.each(self.shipping_fees, function (feeObj) {
	        updatedShippingDotFees[feeObj.country_code] = feeObj.fee;
	      });
	      self.shipping.fees = updatedShippingDotFees;
	    }
	
	    // If it has BOTH shipping.fees AND shipping_fees,
	    // make sure shipping.fees matches shipping_fees.
	    if (hasShippingDotFees && hasShippingUnderscoreFees) {
	      difference = _.difference(_.pluck(self.shipping_fees, "country_code"), Object.keys(self.shipping.fees));
	
	      // If shipping_fees and shipping.fees DO NOT MATCH
	      // set shipping.fees to match shipping_fees.
	      if (!_.isEmpty(difference)) {
	        updatedShippingDotFees = {};
	        _.each(self.shipping_fees, function (feeObj) {
	          updatedShippingDotFees[feeObj.country_code] = feeObj.fee;
	        });
	        self.shipping.fees = updatedShippingDotFees;
	      }
	    }
	
	    // If it has NEITHER shipping.fees nor shipping_fees,
	    // set default objects of everywhere for free for both.
	    if (!hasShippingDotFees && !hasShippingUnderscoreFees) {
	      self.wasShippingSetByDefault = true;
	      self.shipping = { is_free_everywhere: true, fees: { everywhere: 0 } };
	      self.shipping_fees = [{ country_code: "everywhere", fee: 0 }];
	    }
	  }
	
	  function Perk(attributes, options) {
	    attributes = this._processIncomingAttributes(attributes);
	    options = options || {};
	
	    if (angular.isUndefined(options.createDropdownCountryObjects)) {
	      options.createDropdownCountryObjects = true;
	    }
	
	    ///TODO: Check all required attributes AND VALUES are present
	
	    if (attributes.estimated_delivery_date) {
	      attributes.estimated_delivery_date = new Date(attributes.estimated_delivery_date);
	    }
	    attributes.shipping_address_required = attributes.shipping_address_required || false;
	    if (attributes.shipping_address_required) {
	      syncShippingFees(attributes);
	    }
	
	    _.merge(this, attributes);
	
	    // without this the mobile campaign page has big problems
	    // the default is to create the dropdown country objects,
	    // but there is the option to turn it off
	    if (options.createDropdownCountryObjects) {
	      this.dropdownCountryObjects = this._createDropdownCountryObjects();
	    }
	
	    this.sold_out = !!(this.number_available && this.number_claimed >= this.number_available);
	
	    //todo: refactor PerkFactory to get passed an attribute .campaign_shipping_now in the future. for now, this.campaign_shipping_now is used for testing.
	    this.campaign_shipping_now = this.campaign_shipping_now || gon.campaign && !!gon.campaign.is_shipping_now_campaign;
	    if (this.shipping_now && !this.campaign_shipping_now) {
	      this.callout_label = i18n.t('perk_store.shipping_now');
	    } else if (this.featured) {
	      this.callout_label = i18n.t('featured');
	    }
	    this.has_callout_label = !this.sold_out && !!this.callout_label;
	
	    var thisPerkID = 'perk' + this.id;
	    var objToRegister = {};
	    objToRegister[thisPerkID] = this;
	  }
	
	  Perk.prototype.syncShippingFees = syncShippingFees;
	
	  Perk.prototype._processIncomingAttributes = function (attributes) {
	    // create/edit page provides attributes in camel case
	    var dashed_attrs = {};
	    var self = this;
	    _.forEach(attributes, function (n, key) {
	      var ckey = self._snakeCase(key); // use _.snakeCase after lodash upgrade
	      dashed_attrs[ckey] = n;
	    });
	    if (dashed_attrs.shipping) {
	      if (_.has(dashed_attrs.shipping.fees, "europeanUnion")) {
	        dashed_attrs.shipping.fees.european_union = dashed_attrs.shipping.fees.europeanUnion;
	        delete dashed_attrs.shipping.fees.europeanUnion;
	      }
	    }
	    return dashed_attrs;
	  };
	
	  Perk.prototype._snakeCase = function (str) {
	    return str.replace(/([a-z\d])([A-Z])/g, '$1_$2').toLowerCase();
	  };
	
	  Perk.prototype.displayShippingCountries = function () {
	    if (!(this.shipping && _typeof(this.shipping_fees) === 'object')) {
	      return;
	    } else if (this._displayShippingCountries) {
	      return this._displayShippingCountries;
	    }
	
	    var perkShippingCountries = _.pluck(this.shipping_fees, 'country_code');
	    var countryList = [];
	    if (_.include(perkShippingCountries, "everywhere")) {
	      return [i18n.t('worldwide')];
	    } else if (_.include(perkShippingCountries, "european_union")) {
	      perkShippingCountries = _.difference(perkShippingCountries, countries.europeanUnion());
	      perkShippingCountries = _.difference(perkShippingCountries, ["european_union"]);
	      countryList.push(i18n.t("european_union"));
	    }
	    _.each(perkShippingCountries, function (cc) {
	      var currentCountry = countries.findByAlpha2(cc);
	      countryList.push(currentCountry.text);
	    });
	
	    this._displayShippingCountries = countryList.sort();
	    return this._displayShippingCountries;
	  };
	
	  Perk.prototype.hasShippingObject = function () {
	    if (_.isUndefined(this.shipping_address_required)) {
	      $log.error("hashShippingObject() called but shipping_address_required is undefined");
	    }
	    return !!this.shipping && !!this.shipping_address_required;
	  };
	
	  Perk.prototype.isShippingLabelDisplayed = function () {
	    if (this.hasShippingObject()) {
	      var shippingCountries = this.shipping.fees;
	      return !_.all(shippingCountries, function (fee) {
	        return fee === 0;
	      });
	    } else {
	      return false;
	    }
	  };
	
	  Perk.prototype.feeForCountry = function (country) {
	    if (!country) {
	      return null;
	    }
	    if (this.shipping && _typeof(this.shipping.fees) === 'object') {
	      var shippingCountries = Object.keys(this.shipping.fees);
	      var shipsToSpecificCountry = _.include(shippingCountries, country.country_code_alpha_2);
	      var shipsToEU = _.include(shippingCountries, "european_union");
	      var shipsWorldwide = _.include(shippingCountries, "everywhere");
	
	      if (shipsToSpecificCountry) {
	        return this.shipping.fees[country.country_code_alpha_2];
	      } else if (shipsToEU && _.include(country.tags, "european_union")) {
	        return this.shipping.fees.european_union;
	      } else if (shipsWorldwide) {
	        return this.shipping.fees.everywhere;
	      } else {
	        return null;
	      }
	    }
	    return null;
	  };
	
	  Perk.prototype.feeFor = function (twoLetterCtryCode) {
	    return this.feeForCountry(countries.findByAlpha2(twoLetterCtryCode));
	  };
	
	  Perk.prototype.shipsWorldwide = function () {
	    var perkShippingCountryCodes = _.keys(this.shipping.fees);
	    return _.include(perkShippingCountryCodes, 'everywhere');
	  };
	
	  Perk.prototype.shipsToCountry = function (country) {
	    var perkShippingCountryCodes = null;
	    if (!this.shipping) {
	      return true;
	    }
	    if (!perkShippingCountryCodes) {
	      perkShippingCountryCodes = Object.keys(this.shipping.fees);
	    }
	    if (_.include(perkShippingCountryCodes, 'everywhere')) {
	      return !!country;
	    }
	
	    if (_.include(country.tags, "european_union") && _.include(perkShippingCountryCodes, 'european_union')) {
	      return true;
	    }
	    return _.include(perkShippingCountryCodes, country.country_code_alpha_2);
	  };
	
	  Perk.prototype.shipsToCode = function (twoLetterCtryCode) {
	    return this.shipsToCountry(countries.findByAlpha2(twoLetterCtryCode));
	  };
	
	  Perk.prototype._createDropdownCountryObjects = function () {
	    var self = this;
	    if (!this.shipping_address_required) {
	      return [];
	    }
	    if (self._modifiedCountries) {
	      return self._modifiedCountries;
	    }
	    self._modifiedCountries = _.cloneDeep(countries.asUiSelectItems());
	    _.map(self._modifiedCountries, function (ctry) {
	      var countryCode = ctry.country_code_alpha_2;
	      var labelForDropdown = ctry.text;
	      var shipsTo = self.shipsToCountry(ctry);
	      var fee = self.feeForCountry(ctry);
	
	      if (countryCode && !shipsTo) {
	        labelForDropdown += " – " + i18n.t('not_available');
	      }
	
	      ctry.label_for_dropdown = labelForDropdown;
	      ctry.ships_to = shipsTo;
	      ctry.fee = fee;
	    });
	
	    return self._modifiedCountries;
	  };
	
	  Perk.prototype.saveOrUpdatePerk = function saveOrUpdatePerk(campaignId, perkFieldsDisabled) {
	    var url,
	        method,
	        self = this;
	
	    function perkParams() {
	      var paramsList,
	          preOrderParams = ['perk_image_public_id', 'retail_amount'];
	      if (perkFieldsDisabled) {
	        paramsList = preOrderParams;
	      } else {
	        paramsList = gon.api_settings.campaign_perks_controller.permitted_params;
	      }
	      var params = _.pick(self, paramsList);
	      // TODO: when perkFormPreOrder sets it, it's publicId. But when we get it back, it's both. Maybe we should leave it as one?
	      params.perk_image_public_id = self.image && self.image.public_id;
	      return params;
	    }
	
	    if (self.id) {
	      url = '/private_api/campaigns/' + campaignId + '/perks/' + self.id;
	      method = 'PUT';
	    } else {
	      url = '/private_api/campaigns/' + campaignId + '/perks/';
	      method = 'POST';
	    }
	
	    var httpCall = $http({
	      method: method,
	      url: url,
	      data: { perk: perkParams() }
	    });
	
	    httpCall.success(function (data) {
	      if (method === 'PUT') {
	        self.syncShippingFees();
	        self.perk_image_public_id = data.response.perk_image_public_id;
	        self.retail_amount = data.response.retail_amount;
	        self._displayShippingCountries = null;
	        self._displayShippingCountries = self.displayShippingCountries();
	        $rootScope.$broadcast('perkUpdated', self);
	      }
	      if (method === 'POST') {
	        self.perk_image_public_id = data.response.perk_image_public_id;
	        self.retail_amount = data.response.retail_amount;
	        self.secret_perk_path = data.response.secret_perk_path;
	        self.syncShippingFees();
	        self.id = data.response.id;
	        $rootScope.$broadcast('perkCreated', self);
	      }
	    });
	
	    httpCall.error(function () {
	      $rootScope.$broadcast('perkSaveFailure');
	    });
	  };
	
	  Perk.prototype.deletePerk = function (campaignId) {
	    var self = this;
	    var url = '/private_api/campaigns/' + campaignId + '/perks/' + self.id;
	
	    $http({
	      method: 'DELETE',
	      url: url
	    }).success(function () {
	      $rootScope.$broadcast('perkDeleted', self);
	    }).error(function () {
	      $rootScope.$broadcast('perkDeleteFailure');
	    });
	  };
	
	  return Perk;
	}

/***/ },
/* 34 */
/***/ function(module, exports) {

	"use strict";
	
	perkFromGonUsingId.$inject = ["gon", "perkFactory", "$log", "_"];
	Object.defineProperty(exports, "__esModule", {
	  value: true
	});
	exports.default = perkFromGonUsingId;
	/*@ngInject*/
	function perkFromGonUsingId(gon, perkFactory, $log, _) {
	  var Perk = perkFactory;
	  return function findPerk(perkId) {
	    var perkAttr = _.find(gon.campaign.perks, function (perkAttrs) {
	      return perkAttrs.id === parseInt(perkId);
	    });
	    return new Perk(perkAttr);
	  };
	}

/***/ },
/* 35 */
/***/ function(module, exports, __webpack_require__) {

	'use strict';
	
	perkShareBanner.$inject = ["gon", "ga", "gogoEvents", "i18n", "fb", "twitter"];
	Object.defineProperty(exports, "__esModule", {
	  value: true
	});
	exports.default = perkShareBanner;
	/*@ngInject*/
	function perkShareBanner(gon, ga, gogoEvents, i18n, fb, twitter) {
	  return {
	    restrict: 'E',
	    scope: {},
	    template: __webpack_require__(36),
	    link: function link(scope) {
	      var analyticsOptions = {
	        page_location: 'perk'
	      };
	
	      scope.shareFacebook = function () {
	        var options = gon.current_account ? { account_id: gon.current_account.account_id } : {};
	        options.utm_query_string = gon.fb_utm_query_string;
	        fb.share(gon.share.canonical_url, options).then(function () {
	          ga('send', 'event', 'campaign_page_share', 'click_fb_share_successful', gon.ga_impression_data.category);
	          gogoEvents.captureEvent('click_fb_share_successful', analyticsOptions);
	        });
	        ga('send', 'event', 'campaign_page_share', 'click_fb_share', gon.ga_impression_data.category);
	        gogoEvents.captureEvent('click_fb_share', analyticsOptions);
	      };
	
	      scope.shareTwitter = function () {
	        var title = i18n.t('help_make_it_happen_twitter_tooltip', { project_title: gon.share.project_title });
	        twitter.shareTwitter(gon.share.twitter_url, title, gon.share.canonical_url);
	        ga('send', 'event', 'campaign_page_share', 'click_tw_share', gon.ga_impression_data.category);
	        gogoEvents.captureEvent('click_tw_share', analyticsOptions);
	      };
	    }
	  };
	}

/***/ },
/* 36 */
/***/ function(module, exports) {

	module.exports = "<div class=\"perkItem-shareBanner\">\n  <div class=\"shareBanner\">\n    <svg-icon ng-click=\"shareFacebook()\" icon=\"icon-icon-facebook\" class=\"shareBanner-icon shareBanner-fb\"></svg-icon>\n  </div>\n  <div class=\"shareBanner\">\n    <svg-icon ng-click=\"shareTwitter()\" icon=\"icon-icon-twitter\" class=\"shareBanner-icon shareBanner-tw\"></svg-icon>\n  </div>\n</div>\n";

/***/ },
/* 37 */
/***/ function(module, exports, __webpack_require__) {

	'use strict';
	
	perkStoreCard.$inject = ["iggCurrencyFilter", "i18n", "$timeout", "gon"];
	Object.defineProperty(exports, "__esModule", {
	  value: true
	});
	exports.default = perkStoreCard;
	/*@ngInject*/
	function perkStoreCard(iggCurrencyFilter, i18n, $timeout, gon) {
	  return {
	    replace: true,
	    scope: {
	      perk: '=',
	      iggref: '='
	    },
	    template: __webpack_require__(38),
	    link: function link(scope, element) {
	      scope.i18n = i18n;
	
	      scope.amountHtml = function () {
	        return iggCurrencyFilter(scope.perk.perk_amount, scope.perk.currency_iso_num, 'html');
	      };
	
	      scope.getIggref = function () {
	        if (!_.isUndefined(scope.iggref) && !_.isNull(scope.iggref)) {
	          return scope.iggref;
	        } else {
	          return gon.iggref;
	        }
	      };
	
	      if (scope.perk.ad_target_url) {
	        scope.sendToPath = scope.perk.ad_target_url;
	      } else {
	        scope.sendToPath = "/projects/" + scope.perk.campaign_slug + "/" + scope.getIggref();
	      }
	
	      $timeout(function () {
	        element.find('.perkCard-label').dotdotdot({
	          wrap: "letter",
	          watch: "window"
	        });
	      });
	    }
	  };
	}

/***/ },
/* 38 */
/***/ function(module, exports) {

	module.exports = "<a ng-href=\"{{ ::sendToPath }}\" class=\"perkCard\">\n\n  <div ng-if=\"::perk.perk_name\">\n    <div class=\"perkCard-imageContainer\" ng-style=\"{'background-image': 'url(' + perk.perk_image_url +')'}\">\n      <div class=\"perkCard-duskify\"></div>\n\n      <div class=\"perkCard-hoverOverlay\">\n        <div class=\"i-cta-2 i-cta-2-white i-cta-2-white--noHover\">\n          {{ ::i18n.t('see_details') }}\n        </div>\n      </div>\n    </div>\n\n    <div class=\"perkCard-details i-mobile-container--15\">\n      <div class=\"perkCard-label\">\n        {{ ::perk.perk_name }}\n        <span class=\"perkCard-description\">\n          {{ ::perk.short_description }}\n        </span>\n      </div>\n\n      <div class=\"perkCard-price\"\n           ng-bind-html=\"::amountHtml()\">\n      </div>\n\n    </div>\n  </div>\n\n  <div ng-if=\"::perk.ad_target_url\" class=\"perkStoreAd\">\n    <div class=\"perkStoreAd-slug\">\n      {{ ::i18n.t('share_wizard.did_you_know') }}\n    </div>\n    <div class=\"perkStoreAd-description\">\n      {{ ::i18n.t('perk_store.browsing_products') }}\n    </div>\n    <div class=\"perkStoreAd-cta\">\n      {{ ::i18n.t('learn_more') }}\n    </div>\n  </div>\n</a>\n";

/***/ },
/* 39 */
/***/ function(module, exports, __webpack_require__) {

	'use strict';
	
	shipsToCountries.$inject = ["i18n", "perkFactory", "$log", "perkFromGonUsingId"];
	Object.defineProperty(exports, "__esModule", {
	  value: true
	});
	exports.default = shipsToCountries;
	/*@ngInject*/
	function shipsToCountries(i18n, perkFactory, $log, perkFromGonUsingId) {
	  var Perk = perkFactory;
	  return {
	    restrict: 'E',
	    scope: {
	      // one of the following options is required:
	      optionPerk: '=', // perkFactory baby
	      optionPerkId: '=', // perk ID (int)
	      optionPerkAttr: '=' // perk attributes for perkFactory
	    },
	    template: __webpack_require__(40),
	    link: function link(scope) {
	      var MAX_COUNTRY_COUNT = 5;
	      scope.labelText = '';
	      scope.i18n = i18n;
	      scope.andMoreClicked = false;
	
	      if (scope.optionPerkId) {
	        scope.perk = perkFromGonUsingId(scope.optionPerkId);
	      } else if (scope.optionPerkAttr) {
	        scope.perk = new Perk(scope.optionPerkAttr);
	      } else if (scope.optionPerk) {
	        scope.perk = scope.optionPerk;
	      } else {
	        $log.error("ships-to-countries directive incorrectly called");
	      }
	
	      function shipsWorldwide() {
	        return scope.perk.shipsWorldwide();
	      }
	      function moreThanFiveCountries() {
	        var countries = scope.perk.displayShippingCountries();
	        return countries.length > MAX_COUNTRY_COUNT;
	      }
	
	      scope.showCountries = function () {
	        return !shipsWorldwide() && !moreThanFiveCountries();
	      };
	
	      // Select Label
	      if (shipsWorldwide()) {
	        scope.labelText = i18n.t('contribution_flow.line_items.ships_worldwide');
	      } else if (moreThanFiveCountries()) {
	        scope.labelText = i18n.t('contribution_flow.line_items.ships_many');
	      } else {
	        scope.labelText = i18n.t('contribution_flow.line_items.ships_to');
	      }
	
	      scope.perkShippingCountries = scope.perk.displayShippingCountries();
	      scope.$on('perkUpdated', function (event, updatedPerk) {
	        if (updatedPerk.id === scope.perk.id) {
	          scope.perkShippingCountries = scope.perk.displayShippingCountries();
	        }
	      });
	    }
	  };
	}

/***/ },
/* 40 */
/***/ function(module, exports) {

	module.exports = "<div>\n  <span class=\"shipsTo-label i-perkBottom-label\">{{::labelText}}</span>\n  <span class=\"shipsTo-value i-perkBottom-value\"\n        ng-if=\"showCountries()\" ng-repeat=\"country in perkShippingCountries\">\n    {{::country}}{{($last) ? '' : ', '}}\n  </span>\n</div>\n\n";

/***/ },
/* 41 */
/***/ function(module, exports, __webpack_require__) {

	'use strict';
	
	function campaignHeader(campaign) {
	  return {
	    restrict: 'E',
	    scope: {},
	    template: __webpack_require__(42),
	    link: function link(scope) {
	      scope.campaign = campaign;
	      scope.categoryIconRef = '#icon-icon-' + campaign.category_icon_name;
	    }
	  };
	}
	
	module.exports = ['campaign', campaignHeader];

/***/ },
/* 42 */
/***/ function(module, exports) {

	module.exports = "<div class=\"campaignHeader\">\n  <div class=\"campaignHeader-titleBylineContainer\">\n    <h1 class=\"campaignHeader-title\">{{::campaign.title}}</h1>\n    <div class=\"campaignHeader-byline\">\n\n      <div class=\"campaignHeader-bylineComponent\">\n        <div class=\"campaignHeader-city\" ng-if=\"campaign.city\">\n          <svg><use xlink:href=\"#icon-icon-location\"></use></svg>\n          <a ng-href=\"/explore?filter_city={{::campaign.city}}\">{{::campaign.city}}</a>\n        </div>\n        <div class=\"campaignHeader-location\" ng-if=\"campaign.location\">\n          <svg><use xlink:href=\"#icon-icon-location\"></use></svg>\n          <a ng-href=\"/explore?filter_city={{::campaign.city}}\">\n            {{::campaign.location}}\n          </a>\n        </div>\n      </div>\n\n      <div class=\"campaignHeader-bylineComponent\" ng-if=\"campaign.category\">\n        <div class=\"campaignHeader-category\">\n          <svg><use xlink:href=\"{{categoryIconRef}}\"></use></svg>\n          <a ng-href=\"/explore/{{::campaign.category_slug}}\">{{campaign.category}}</a>\n        </div>\n      </div>\n    </div>\n  </div>\n  <div class=\"campaignHeader-followContainer\">\n    <follow-mobile></follow-mobile>\n  </div>\n</div>\n";

/***/ },
/* 43 */
/***/ function(module, exports, __webpack_require__) {

	'use strict';
	
	function followMobile(campaign, gon, i18n, ga, $rootScope) {
	  return {
	    restrict: 'E',
	    scope: {},
	    template: __webpack_require__(44),
	    link: function link(scope, element, attrs) {
	      scope.campaign = campaign;
	      scope.i18n = i18n;
	      scope.campaignFollowPath = gon.urls.campaign_follow_path;
	      scope.campaignUnfollowPath = gon.urls.campaign_unfollow_path;
	      scope.campaignFbLoginFollowPath = gon.urls.campaign_fb_login_follow_path;
	      scope.loadingFollowAsync = false;
	      scope.loggedIn = gon.logged_in;
	
	      scope.followToggle = function () {
	        scope.loadingFollowAsync = true;
	
	        var stopSpinner = function stopSpinner(errorStatus) {
	          scope.loadingFollowAsync = false;
	
	          if (errorStatus == 401) {
	            element.find('[campaign-login]').removeClass("i-hidden");
	            element.find('.i-login-modal').addClass('i-pop-in-modal');
	          } else {
	            var followStatusMessage;
	            if (scope.campaign.followed) {
	              followStatusMessage = i18n.t("tracking_success", { title: campaign.title, email: gon.current_user.email });
	              ga.apply(this, ['send', 'event', 'Mobile Web Campaign Page', 'Successful Follow']);
	            } else {
	              followStatusMessage = i18n.t("remove_tracking_success", { title: campaign.title });
	              ga.apply(this, ['send', 'event', 'Mobile Web Campaign Page', 'Successful Unfollow']);
	            }
	            $rootScope.$broadcast('campaignNotification', followStatusMessage);
	          }
	        };
	
	        if (campaign.followed) {
	          campaign.unfollow(stopSpinner);
	        } else {
	          campaign.follow(stopSpinner);
	        }
	      };
	
	      if (gon.follow_after_load && !campaign.followed) {
	        scope.followToggle();
	      }
	    }
	  };
	}
	
	module.exports = ['campaign', 'gon', 'i18n', 'ga', '$rootScope', followMobile];

/***/ },
/* 44 */
/***/ function(module, exports) {

	module.exports = "<a\n  ng-class=\"{'i-active': campaign.followed && campaign.state() !== campaign.states.draft, 'ng-hide-add': loadingFollowAsync}\"\n  ng-click=\"campaign.state() !== campaign.states.draft && followToggle()\"\n  ng-disabled=\"campaign.state() === campaign.states.draft\"\n  analytics-on=\"click\"\n  analytics-name=\"mobile_web_campaign_page_follow_heart_click\"\n  analytics-category=\"Mobile Web Campaign Page\"\n  analytics-action=\"Tap Follow Heart\"\n  analytics-label=\"{{loggedIn ? 'Logged In' : 'Logged Out'}}\"\n  class=\"followMobile\">\n  <svg class=\"category-icon\"><use xmlns:xlink=\"http://www.w3.org/1999/xlink\" xlink:href=\"#icon-icon-following\"></use></svg>\n</a>\n<div class=\"i-campaign-spinner\" ng-class=\"{'ng-show-add': loadingFollowAsync}\"></div>\n<div class=\"i-login-modal-container i-hidden\" path=\"campaignFbLoginFollowPath\" campaign-login></div>\n<div campaign-modal></div>\n";

/***/ },
/* 45 */
/***/ function(module, exports, __webpack_require__) {

	'use strict';
	
	function campaignModal($sce, browser) {
	  'use strict';
	
	  return {
	    restrict: 'A',
	    transclude: false,
	    replace: false,
	    scope: {
	      message: "@"
	    },
	    template: __webpack_require__(46),
	    link: function link(scope) {
	      scope.modalVisible = false;
	
	      scope.$on('campaignNotification', function (event, message) {
	        browser.scrollToTop();
	        scope.trustedMessage = $sce.trustAsHtml(message);
	        scope.modalVisible = true;
	      });
	
	      scope.hideModal = function () {
	        scope.modalVisible = false;
	      };
	    }
	  };
	}
	module.exports = ['$sce', 'browser', campaignModal];

/***/ },
/* 46 */
/***/ function(module, exports) {

	module.exports = "<div class=\"i-flash-modal-container\" ng-class=\"{'i-visible': modalVisible}\" ng-click=\"hideModal()\">\n  <div class=\"i-flash-modal messageNotification messageNotification--success\">\n    <div class=\"modal-close\"><svg><use xlink:href=\"#icon-icon-close\"></use></svg></div>\n    <div class=\"i-flash-modal-content\" ng-bind-html=\"trustedMessage\"></div>\n  </div>\n</div>\n";

/***/ },
/* 47 */
/***/ function(module, exports, __webpack_require__) {

	'use strict';
	
	function campaignShareLinks($http, gon, i18n, fb, twitter, ga, gogoEvents, $timeout, $window, browser, $modal, $sce, $compile) {
	  return {
	    scope: {
	      pageLocation: '@'
	    },
	    restrict: 'A',
	    template: __webpack_require__(48),
	    link: function link(scope, element) {
	      var changeFollowingStatus = function changeFollowingStatus(finalStatus, path) {
	        var originalStatus = scope.isStartingToFollowProject;
	        scope.isStartingToFollowProject = finalStatus;
	        $http.post(path).then(function () {
	          scope.isFollowingProject = finalStatus;
	        }, function () {
	          scope.isStartingToFollowProject = originalStatus;
	        });
	      };
	
	      var analyticsOptions = _.merge({}, {
	        page_location: scope.pageLocation
	      });
	
	      scope.twitterCount = null;
	      twitter.countForUrl(gon.share.canonical_url).then(function (count) {
	        scope.twitterCount = count;
	      });
	
	      scope.i18n = i18n;
	      scope.isFollowingProject = gon.share.following;
	      scope.isStartingToFollowProject = scope.isFollowingProject;
	      scope.shareLinkUrl = gon.share.sharing_url;
	      scope.ga_impression_data = gon.ga_impression_data;
	      scope.toggleFollowing = function () {
	        if (gon.share.account_id) {
	          if (scope.isFollowingProject) {
	            changeFollowingStatus(false, gon.urls.campaign_unfollow_path);
	          } else {
	            changeFollowingStatus(true, gon.urls.campaign_follow_path);
	          }
	        } else {
	          browser.redirectTo(gon.urls.follow_login_path);
	        }
	      };
	
	      scope.fb = fb;
	      fb.fetchShareCount();
	
	      scope.shareFacebook = function () {
	        // TODO EVENTS: id=neic3 subsystem=share fixtype=ga+captureEvent category=campaign_page_share category-new=TBD action=click_fb_share label=dynamic name=click_fb_share . review
	        ga('send', 'event', 'campaign_page_share', 'click_fb_share', scope.ga_impression_data.category);
	        // TODO EVENTS: id=ea9th subsystem=share fixtype=ga-social . review social
	        ga('send', 'social', { 'socialNetwork': 'facebook_desktop', 'socialAction': 'share' });
	        gogoEvents.captureEvent('click_fb_share', analyticsOptions);
	
	        var options = gon.current_account ? { account_id: gon.current_account.account_id } : {};
	        options.utm_query_string = gon.fb_utm_query_string;
	
	        // TODO EVENTS: id=ushe3 subsystem=share fixtype=fb-share . review
	        fb.share(gon.share.canonical_url, options);
	      };
	
	      scope.shareTwitter = function () {
	        // TODO EVENTS: id=tae7i fixtype=ga+captureEvent category=campaign_page_share category-new=TBD action=click_tw_share action-new=TBD label=dynamic name=click_fw_share subsystem=share . review
	        ga('send', 'event', 'campaign_page_share', 'click_tw_share', scope.ga_impression_data.category);
	        gogoEvents.captureEvent('click_tw_share', analyticsOptions);
	
	        twitter.shareTwitter(gon.share.twitter_url, i18n.t('help_make_it_happen_twitter_tooltip', { project_title: gon.share.project_title }), gon.share.canonical_url);
	      };
	
	      scope.shareEmailVisible = function () {
	        if (gon.current_account) {
	          return _.any(gon.campaign.team_members, function (member) {
	            return member.account_id == gon.current_account.account_id;
	          });
	        }
	        return false;
	      }();
	
	      $timeout(function () {
	        fb.refreshAllWidgets();
	        twitter.refreshAllWidgets();
	      });
	
	      scope.openEmbedModal = function () {
	        $modal({
	          scope: scope,
	          template: __webpack_require__(49)
	        });
	        $timeout(function () {
	          $compile(angular.element('.i-project-card'))(scope);
	        });
	      };
	
	      scope.projectCardHtml = $sce.trustAsHtml(gon.embed_modal_info.card_html);
	      scope.iframeString = gon.embed_modal_info.iframe_html;
	      scope.selectTextarea = function () {
	        element.get('textarea').select();
	      };
	
	      twitter.onTweet(function () {
	        // TODO EVENTS: id=ulie5 fixtype=ga+captureEvent category=campaign_page_share category-new=TBD action=click_tw_share action-new=TBD label=dynamic subsystem=share . review
	        ga('send', 'event', 'campaign_page_share', 'click_tw_share', scope.ga_impression_data.category);
	        // TODO EVENTS: id=diel9 subsystem=campaign-page fixtype=ga-social . review social
	        ga('send', 'social', { 'socialNetwork': 'twitter_desktop', 'socialAction': 'share' });
	        gogoEvents.captureEvent('click_tw_share', analyticsOptions);
	      });
	    }
	  };
	}
	
	module.exports = ['$http', 'gon', 'i18n', 'fb', 'twitter', 'ga', 'gogoEvents', '$timeout', '$window', 'browser', '$modal', '$sce', '$compile', campaignShareLinks];

/***/ },
/* 48 */
/***/ function(module, exports) {

	module.exports = "<div class=\"campaignShare\">\n  <a share-banner\n     icon=\"icon-icon-facebook\"\n     label-text=\"{{(fb.shareCount || 'Share') | abbrevNumFmt}}\"\n     hover-label-text=\"Share\"\n     ng-click=\"shareFacebook()\"\n     class=\"campaignShare-component\"></a>\n  <a share-banner\n     icon=\"icon-icon-twitter\"\n     label-text=\"{{(twitterCount || 'Tweet') | abbrevNumFmt}}\"\n     hover-label-text=\"Tweet\"\n     ng-click=\"shareTwitter()\"\n     class=\"campaignShare-component\"></a>\n  <a class=\"campaignShare-component\"\n     ng-if=\"shareEmailVisible\"\n     email-importer>\n    <span share-banner icon=\"icon-icon-mail\"\n          label-text=\"{{i18n.t('email')}}\"></span>\n  </a>\n  <!-- TODO EVENTS: id=sah8o fixtype=ga-event-dir subsystem=campaign-page trigger=click dom=a category=campaign_page_share category-new=TBD action=embed label=dynamic name-new=TBD . review -->\n  <a href=\"\" ng-click=\"openEmbedModal()\" class=\"campaignShare-component\"\n     analytics-on=\"click\"\n     analytics-name=\"campaign_page_share_click\"\n     analytics-category=\"campaign_page_share\"\n     analytics-event=\"embed\"\n     analytics-label=\"{{ga_impression_data.category}}\">\n    <span share-banner icon=\"icon-icon-embed\" label-text=\"{{i18n.t('embed')}}\"></span>\n  </a>\n  <!-- TODO EVENTS: id=da1ou fixtype=ga-event-dir subsystem=campaign-page trigger=click dom=a category=campaign_page_share category-new=TBD action=link label=dynamic name-new=TBD . review -->\n  <a copy-url=\"{{shareLinkUrl}}\" class=\"campaignShare-component\"\n     analytics-on=\"click\"\n     analytics-name=\"campaign_page_share_link\"\n     analytics-category=\"campaign_page_share\"\n     analytics-event=\"link\"\n     analytics-label=\"{{ga_impression_data.category}}\">\n    <span share-banner icon=\"icon-icon-link\" label-text=\"{{i18n.t('link')}}\"></span>\n  </a>\n  <!-- TODO EVENTS: id=aih0s fixtype=ga-event-dir subsystem=campaign-page trigger=click dom=a category=campaign_page_share category-new=TBD action=follow label=dynamic name-new=TBD . review -->\n  <a ng-click=\"toggleFollowing()\"\n     analytics-on=\"click\"\n     analytics-name=\"campaign_page_share_follow\"\n     analytics-category=\"campaign_page_share\"\n     analytics-event=\"follow\"\n     analytics-label=\"{{ga_impression_data.category}}\"\n     class=\"campaignShare-component campaignShare-follow\">\n    <span share-banner icon=\"icon-icon-follow\"\n          variant=\"{{isStartingToFollowProject ? 'active' : null}}\"\n          label-text=\"{{isFollowingProject ? i18n.t('following') : i18n.t('follow')}}\"\n      ></span>\n  </a>\n</div>\n";

/***/ },
/* 49 */
/***/ function(module, exports) {

	module.exports = "<div class=\"modal i-modal i-embed-lightbox\">\n  <div class=\"modal-dialog i-modal-wider\">\n    <div class=\"modal-content\">\n      <a class=\"modal-close\" ng-click=\"$hide()\" aria-hidden=\"true\"><svg><use xlink:href=\"#icon-icon-close\"></use></svg></a>\n      <div class=\"row\">\n        <div class=\"col-sm-8\">\n          <h3>{{ i18n.t('widget_embed.embed_this_card_in_your_website_or_blog') }}</h3>\n\n          <p>{{ i18n.t('widget_embed.copy_code_below') }}</p>\n          <textarea class=\"i-code-text\" readonly=\"true\" ng-click=\"selectTextarea()\" rows=\"8\">{{iframeString}}</textarea>\n        </div>\n        <div class=\"col-sm-4\" ng-bind-html=\"projectCardHtml\">\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n";

/***/ },
/* 50 */
/***/ function(module, exports, __webpack_require__) {

	'use strict';
	
	function campaignTags(gon, i18n, campaign, $window) {
	  return {
	    restrict: 'E',
	    scope: {},
	    template: __webpack_require__(51),
	    link: function link(scope) {
	      scope.i18n = i18n;
	      scope.campaign = campaign;
	      scope.tagLink = function (tag) {
	        return '/search#/?q=' + $window.escape('#' + tag);
	      };
	    }
	  };
	}
	
	module.exports = ['gon', 'i18n', 'campaign', '$window', campaignTags];

/***/ },
/* 51 */
/***/ function(module, exports) {

	module.exports = "<a class=\"campaignTag\" ng-repeat=\"tag in campaign.non_blacklisted_tags\" href=\"{{tagLink(tag)}}\">\n  #{{tag}}\n</a>\n";

/***/ },
/* 52 */
/***/ function(module, exports, __webpack_require__) {

	'use strict';
	
	function campaignTaglineStory(i18n, $state, campaign) {
	  return {
	    restrict: 'E',
	    scope: {},
	    template: __webpack_require__(53),
	    link: function link(scope) {
	      scope.campaign = campaign;
	      scope.i18n = i18n;
	    }
	  };
	}
	
	module.exports = ['i18n', '$state', 'campaign', campaignTaglineStory];

/***/ },
/* 53 */
/***/ function(module, exports) {

	module.exports = "<div class=\"campaignTaglineStory\">\n  <div class=\"campaignTaglineStory-tagline\">\n    {{campaign.tagline}}\n  </div>\n\n  <campaign-tags class=\"campaignTaglineStory-tags\"></campaign-tags>\n\n  <!-- TODO EVENTS: id=quae8 fixtype=ga-event-dir subsystem=campaign-page trigger=click dom=a category=Mobile.Web.Campaign.Page action=Tap.Read.Story name-new=TBD . review -->\n  <a class=\"campaignTaglineStory-storyLink\"\n     ui-sref=\"story\"\n     analytics-on=\"click\"\n     analytics-name=\"mobile_web_campaign_page_read_story_click\"\n     analytics-category=\"Mobile Web Campaign Page\"\n     analytics-event=\"Tap Read Story\">\n    <span>{{::i18n.t(\"read_story\")}}</span>\n    <svg><use xlink:href=\"#icon-icon-rightarrow\"></use></svg>\n  </a>\n</div>\n";

/***/ },
/* 54 */
/***/ function(module, exports, __webpack_require__) {

	'use strict';
	
	function campaignPitchmedia($sce, campaign, gon) {
	  return {
	    restrict: 'E',
	    scope: {},
	    transclude: false,
	    replace: false,
	    template: __webpack_require__(55),
	    link: function link(scope, element, attrs, nullController, transclude) {
	      scope.campaign = campaign;
	      scope.campaign_pitch_image = gon.urls.pitch_image_url || "";
	    }
	  };
	}
	
	module.exports = ['$sce', 'campaign', 'gon', campaignPitchmedia];

/***/ },
/* 55 */
/***/ function(module, exports) {

	module.exports = "<campaign-video\n  type=\"{{campaign.main_video_info.type}}\"\n  id=\"{{campaign.main_video_info.id}}\"\n  overlay_url=\"{{campaign.video_overlay_url}}\"\n  class=\"campaignVideo\"\n  ng-if=\"campaign.main_video_info.type\">\n</campaign-video>\n\n<img class=\"campaignPitchMedia-image\" ng-src=\"{{campaign_pitch_image}}\" ng-if=\"!campaign.main_video_info.type && campaign_pitch_image\">\n";

/***/ },
/* 56 */
/***/ function(module, exports, __webpack_require__) {

	'use strict';
	
	function campaignTrustTeaser(i18n, gon, campaign, $state, browser) {
	  return {
	    restrict: 'E',
	    scope: {},
	    template: __webpack_require__(57),
	    link: function link(scope) {
	      scope.i18n = i18n;
	      scope.trust_passport = _.clone(gon.trust_passport);
	      scope.owner = _.clone(gon.trust_passport.owner);
	      scope.campaign = campaign;
	      scope.campaignIconRef = '#icon-icon-' + campaign.category_icon_name;
	    }
	  };
	}
	
	module.exports = ['i18n', 'gon', 'campaign', '$state', 'browser', campaignTrustTeaser];

/***/ },
/* 57 */
/***/ function(module, exports) {

	module.exports = "<div class=\"campaignTrustTeaser\">\n  <div class=\"campaignTrustTeaser-item\">\n    <div class=\"campaignTrustTeaser-graphic\">\n      <img class=\"campaignTrustTeaser-circle\" ng-src=\"{{owner.avatar_url}}\">\n    </div>\n\n    <div class=\"campaignTrustTeaser-text\">\n      <div class=\"campaignTrustTeaser-text-title\">\n        {{owner.name}}\n      </div>\n      <div ng-if=\"owner.admin_verified\">\n        {{::i18n.t('trust_passport.identity_verified')}}\n      </div>\n      <div ng-if=\"owner.email_verified\">\n        {{::i18n.t(\"email_verified\")}}\n      </div>\n      <div ng-if=\"owner.facebook_friends_count\">\n        {{i18n.t('facebook_friends', {count: owner.facebook_friends_count})}}\n      </div>\n      <div ng-if=\"owner.linkedin_profile_url\">\n        {{::i18n.t(\"linkedin_verified\")}}\n      </div>\n      <div class=\"campaignTrustTeaser--mobile-only\">\n        {{i18n.t('team_members', { count: trust_passport.project.team_members.length }).toLowerCase()}}\n      </div>\n    </div>\n  </div>\n\n  <div class=\"campaignTrustTeaser-item campaignTrustTeaser--desktop-only\">\n    <div class=\"campaignTrustTeaser-graphic\">\n      <div class=\"campaignTrustTeaser-circle campaignTrustTeaser-circle-icon\"><svg><use xlink:href=\"{{campaignIconRef}}\"></use></svg></div>\n    </div>\n\n    <div class=\"campaignTrustTeaser-text\">\n      <div class=\"campaignTrustTeaser-text-title\" ng-if=\"trust_passport.project.category\">\n        {{::i18n.t(trust_passport.project.category.slug)}}\n      </div>\n      <div>\n        {{trust_passport.project.city_state}}\n      </div>\n      <div>\n        {{trust_passport.project.country}}\n      </div>\n      <div>\n        {{i18n.t('team_members', { count: trust_passport.project.team_members.length }).toLowerCase()}}\n      </div>\n    </div>\n  </div>\n</div>\n";

/***/ },
/* 58 */
/***/ function(module, exports, __webpack_require__) {

	'use strict';
	
	// NOTE: This directive is a stub that switches between the two non-responsive trust passports,
	//       each of which will be combined into a single responsive one in the future.
	function campaignTrustPassport(i18n) {
	  return {
	    restrict: 'E',
	    scope: {},
	    template: __webpack_require__(59),
	    link: function link(scope) {
	      scope.i18n = i18n;
	    }
	  };
	}
	
	module.exports = ['i18n', campaignTrustPassport];

/***/ },
/* 59 */
/***/ function(module, exports) {

	module.exports = "<div class=\"campaignTrustPassport-mobile\">\n  <a class=\"campaignTrustPassport-mobile-links\" ui-sref=\"trust_passport\" href=\"\">\n    {{::i18n.t('trust_passport.see_more_details')}}\n  </a>\n</div>\n<div class=\"campaignTrustPassport-desktop\">\n  <campaign-trust-passport-desktop></campaign-trust-passport-desktop>\n</div>\n";

/***/ },
/* 60 */
/***/ function(module, exports, __webpack_require__) {

	'use strict';
	
	function campaignTrustPassportMobile(campaign, i18n, gon, $state, browser, trustPassport) {
	  return {
	    restrict: 'E',
	    scope: {},
	    transclude: false,
	    replace: false,
	    template: __webpack_require__(61),
	    link: function link(scope) {
	      scope.i18n = i18n;
	      scope.project = trustPassport.project;
	      scope.owner = trustPassport.owner;
	      scope.hasVerifications = trustPassport.hasVerifications;
	      scope.idVerifiedEnabled = trustPassport.idVerifiedEnabled;
	      scope.loggedIn = trustPassport.loggedIn;
	      scope.loginUrl = trustPassport.loginUrl;
	      scope.hasWebsites = trustPassport.websites.length > 0;
	      scope.websites = trustPassport.websites;
	
	      scope.campaignContributionPath = gon.urls.campaign_contribution_path;
	      scope.state = $state;
	
	      scope.contact = function () {
	        $state.go('contact').then(function () {
	          browser.scrollToTop();
	        });
	      };
	
	      // This is whether the small dropdown which displays a team members bio ( description ) is actively being
	      // displayed, and is toggled to keep state of what to show and hide.
	      scope.teamMemberDetailsVisible = {};
	    }
	  };
	}
	
	module.exports = ['campaign', 'i18n', 'gon', '$state', 'browser', 'trustPassport', campaignTrustPassportMobile];

/***/ },
/* 61 */
/***/ function(module, exports) {

	module.exports = "<section class=\"campaignTrustPassportMobile-mainHeader\" ui-sref=\"main\" style=\"background-image: url({{campaign.image_types.medium}})\">\n  <div class=\"campaignTrustPassportMobile-overlay\">\n    <svg><use xlink:href=\"#left-caret\"></use></svg>\n    <span>{{project.title}}</span>\n  </div>\n</section>\n\n<div class=\"campaignTrustPassportMobile-section campaignTrustPassportMobile-about\">\n  <img class=\"campaignTrustPassportMobile-avatar\" ng-src=\"{{owner.avatar_url}}\"/>\n  <div class=\"campaignTrustPassportMobile-ownerInfo\">\n    <div class=\"campaignTrustPassportMobile-name\">{{owner.name}}</div>\n    <div class=\"campaignTrustPassportMobile-role\">{{owner.role}}</div>\n  </div>\n\n  <div ng-if=\"owner.description.length > 0\">\n    <div class=\"campaignTrustPassportMobile-subSectionTitle\">{{::i18n.t('trust_passport.about_something', { something: owner.first_name})}}</div>\n    <div>{{owner.description}}</div>\n  </div>\n\n  <div ng-if=\"hasVerifications\">\n    <div class=\"campaignTrustPassportMobile-subSectionTitle\">{{::i18n.t('verifications')}}</div>\n    <div class=\"campaignTrustPassportMobile-verification\" ng-if=\"owner.admin_verified\">\n      <svg class=\"campaignTrustPassportMobile-basicIcon\"><use xlink:href=\"#icon-icon-check\"></use></svg>\n      <span>{{::i18n.t('trust_passport.identity_verified')}}</span>\n    </div>\n    <div class=\"campaignTrustPassportMobile-verification\" ng-if=\"owner.email_verified\">\n      <svg class=\"campaignTrustPassportMobile-basicIcon\"><use xlink:href=\"#icon-icon-mail\"></use></svg>\n      <span>{{::i18n.t('email_verified')}}</span>\n    </div>\n    <div class=\"campaignTrustPassportMobile-verification\" ng-if=\"owner.facebook_verified\">\n      <svg class=\"campaignTrustPassportMobile-socialIcon campaignTrustPassportMobile-socialIcon--facebook\"><use xlink:href=\"#icon-icon-facebook\"></use></svg>\n      <span>{{i18n.t('facebook_friends', {count: owner.facebook_friends_count})}}</span>\n    </div>\n    <div class=\"campaignTrustPassportMobile-verification\" ng-if=\"owner.linkedin_verified\">\n      <svg class=\"campaignTrustPassportMobile-socialIcon campaignTrustPassportMobile-socialIcon--linkedin\"><use xlink:href=\"#icon-icon-linkedin\"></use></svg>\n      <span>{{::i18n.t('linkedin_verified')}}</span>\n    </div>\n  </div>\n\n  <div>\n    <div class=\"campaignTrustPassportMobile-subSectionTitle\">{{::i18n.t('trust_passport.impact')}}</div>\n    <div>\n      {{i18n.t('trust_passport.campaigns_created', {count: owner.campaigns_count})}}\n    </div>\n    <div ng-if=\"owner.contributions_count\">\n      {{i18n.t('trust_passport.contributions_made', {count: owner.contributions_count})}}\n    </div>\n    <div ng-if=\"owner.comments_count\">\n      {{i18n.t('trust_passport.comments_made', {count: owner.comments_count})}}\n    </div>\n  </div>\n\n  <div class=\"campaignTrustPassportMobile-contactLink\">\n    <a href=\"\" ng-click=\"contact()\" ng-if=\"loggedIn && !$state.is('contact')\">{{::i18n.t('contact')}}</a>\n    <a href=\"\" ng-href=\"{{loginUrl}}\" ng-if=\"!loggedIn\">{{::i18n.t('contact')}}</a>\n  </div>\n</div>\n\n<div class=\"campaignTrustPassportMobile-subHeader\">{{::i18n.t('trust_passport.details')}}</div>\n\n<div class=\"campaignTrustPassportMobile-section campaignTrustPassportMobile-details\">\n  <div ng-if=\"project.category\">{{::i18n.t(project.category.slug)}}</div>\n  <div>{{project.location}}</div>\n\n  <div class=\"campaignTrustPassportMobile-subSectionTitle\">{{::i18n.t('trust_passport.recent_activity')}}</div>\n  <div>{{project.activity}}</div>\n\n  <div class=\"campaignTrustPassportMobile-subSectionTitle\" ng-if=\"websites.length > 0\">{{::i18n.t('websites')}}</div>\n  <div class=\"campaignTrustPassportMobile-websites\" ng-repeat=\"website in websites\">\n    <a target=\"blank\" ng-href=\"{{website.url}}\">{{website.text}}</a>\n  </div>\n\n  <div class=\"campaignTrustPassportMobile-subSectionTitle\" ng-if=\"project.bank_account_country\">{{::i18n.t('bank_account_country')}}</div>\n  <div>{{project.bank_account_country}}</div>\n</div>\n\n<div class=\"campaignTrustPassportMobile-blankHeader\"></div>\n\n<div class=\"campaignTrustPassportMobile-teamMember campaignTrustPassportMobile-teamMemberCount\">\n  {{i18n.t('team_members_reversed', {count: project.team_members.length})}}\n</div>\n\n<div class=\"campaignTrustPassportMobile-teamMembers\">\n  <div class=\"campaignTrustPassportMobile-teamMember\" ng-repeat=\"team_member in project.team_members\">\n    <div class=\"campaignTrustPassportMobile-teamMember-expandControl\">\n      <svg ng-if=\"team_member.description.trim().length > 0 && !teamMemberDetailsVisible[team_member.id]\" ng-click=\"teamMemberDetailsVisible[team_member.id] = true\">\n        <use xlink:href=\"#down-caret\"></use>\n      </svg>\n      <svg ng-if=\"teamMemberDetailsVisible[team_member.id]\" ng-click=\"teamMemberDetailsVisible[team_member.id] = false\">\n        <use xlink:href=\"#up-caret\"></use>\n      </svg>\n    </div>\n    <img class=\"campaignTrustPassportMobile-avatar\" ng-src=\"{{team_member.avatar_url}}\"/>\n    <div class=\"campaignTrustPassportMobile-teamMemberInfo\">\n      <div class=\"campaignTrustPassportMobile-name\">{{team_member.name}}</div>\n      <div class=\"campaignTrustPassportMobile-role\">{{team_member.role}}</div>\n      <div class=\"campaignTrustPassportMobile-teamMemberInfo-verifications\" ng-if=\"hasVerifications\">\n        <svg class=\"campaignTrustPassportMobile-basicIcon\" ng-if=\"team_member.admin_verified\"><use xlink:href=\"#icon-icon-check\"></use></svg>\n        <svg class=\"campaignTrustPassportMobile-basicIcon\" ng-if=\"team_member.email_verified\"><use xlink:href=\"#icon-icon-mail\"></use></svg>\n        <svg class=\"campaignTrustPassportMobile-socialIcon campaignTrustPassportMobile-socialIcon--facebook\" ng-if=\"team_member.facebook_verified\"><use xlink:href=\"#icon-icon-facebook\"></use></svg>\n        <svg class=\"campaignTrustPassportMobile-socialIcon campaignTrustPassportMobile-socialIcon--linkedin\" ng-if=\"team_member.linkedin_verified\"><use xlink:href=\"#icon-icon-linkedin\"></use></svg>\n      </div>\n      <div ng-if=\"team_member.description.trim().length > 0 && teamMemberDetailsVisible[team_member.id]\">\n        {{team_member.description}}\n      </div>\n    </div>\n  </div>\n</div>\n";

/***/ },
/* 62 */
/***/ function(module, exports, __webpack_require__) {

	'use strict';
	
	function campaignContactMobile(gon, i18n, $http, $state, $rootScope, $timeout, $window, vcRecaptchaService) {
	  return {
	    restrict: 'E',
	    scope: {},
	    transclude: false,
	    replace: false,
	    template: __webpack_require__(63),
	    link: function link(scope) {
	      scope.i18n = i18n;
	      scope.owner = _.clone(gon.trust_passport.owner);
	      scope.message = {
	        text: ''
	      };
	      scope.grecaptcha_site_key = gon.trust_passport.grecaptcha_site_key;
	      var recaptchaId = null;
	      var recaptchaSuccess = false;
	      var backdoorRecaptchaResponse = null;
	
	      var contactOwnerEndpointUrl = _.clone(gon.trust_passport.contact_owner_endpoint_url);
	
	      scope.sendMessageDisabled = function () {
	        return !(scope.message.text.length > 0 && recaptchaId !== null && recaptchaSuccess);
	      };
	
	      scope.setReCaptchaReady = function (widgetId) {
	        recaptchaId = widgetId;
	      };
	
	      scope.onRecaptchaSuccess = function () {
	        recaptchaSuccess = true;
	      };
	
	      scope.backdoorRecaptcha = function () {
	        recaptchaId = 1;
	        recaptchaSuccess = true;
	        backdoorRecaptchaResponse = 'response';
	      };
	
	      scope.sendMessage = function () {
	        var reCaptchaResponse = backdoorRecaptchaResponse || vcRecaptchaService.getResponse(recaptchaId);
	        $http.post(contactOwnerEndpointUrl, { comment: { text: scope.message.text }, grecaptcha: reCaptchaResponse }).then(function () {
	          returnToMainStateAndNotify('trust_passport.your_message_has_been_sent');
	        }, function () {
	          returnToMainStateAndNotify('trust_passport.sorry_somethings_wrong_on_our_end');
	        }).finally(function () {
	          if (recaptchaSuccess) {
	            recaptchaSuccess = false;
	            backdoorRecaptchaResponse = null;
	            vcRecaptchaService.reload();
	          }
	        });
	      };
	
	      var returnToMainStateAndNotify = function returnToMainStateAndNotify(translation_id) {
	        $state.go('main').then(function () {
	          // Send the event after the current digest cycle, so that it takes effect after the state changes
	          $timeout(function () {
	            $rootScope.$broadcast('campaignNotification', i18n.t(translation_id));
	          });
	        });
	        scope.message.text = '';
	      };
	    }
	  };
	}
	
	module.exports = ['gon', 'i18n', '$http', '$state', '$rootScope', '$timeout', '$window', 'vcRecaptchaService', campaignContactMobile];

/***/ },
/* 63 */
/***/ function(module, exports) {

	module.exports = "<div class=\"campaignContactMobile\">\n  <div class=\"campaignContactMobile-name\">{{::i18n.t('contact_campaign_owner', {campaign_owner: owner.name})}}</div>\n  <div class=\"campaignContactMobile-note\">{{::i18n.t('trust_passport.campaign_owner_will_be_able_to_reply_directly', {owner: owner.name})}}</div>\n  <textarea class=\"campaignContactMobile-message\" name=\"campaignContactMobile-message\" ng-model=\"message.text\" maxlength=\"500\"></textarea>\n  <div class=\"campaignContactMobile-submitMessage\">\n    <div class=\"g-recaptcha\" vc-recaptcha key=\"grecaptcha_site_key\" on-create=\"setReCaptchaReady()\" on-success=\"onRecaptchaSuccess()\"></div>\n    <button class=\"i-cta-1\" ng-disabled=\"sendMessageDisabled()\" ng-click=\"sendMessage()\">{{::i18n.t('send_message')}}</button>\n  </div>\n</div>\n\n";

/***/ },
/* 64 */
/***/ function(module, exports) {

	'use strict';
	
	/* jshint expr: true */
	function campaignService($sce, $http, gon, i18n) {
	
	  var formatLocation = function formatLocation(campaign) {
	    var locationArray = [];
	    if (campaign.city) {
	      locationArray.push(campaign.city);
	    }
	    if (campaign.region) {
	      locationArray.push(campaign.region);
	    }
	    if (campaign.country) {
	      locationArray.push(campaign.country);
	    }
	
	    return locationArray.join(", ");
	  };
	
	  var postFollow = function postFollow(self, followUrl, newFollowState, callback) {
	    $http.post(followUrl, { params: {} }).success(function (data, status, headers, config) {
	      self.followed = newFollowState;
	      if (callback) callback(null);
	    }).error(function (data, status, headers, config) {
	      //TODO: Handle Error
	      if (callback) callback(status);
	    });
	  };
	
	  return {
	    title: null,
	    image_types: null,
	    tagline: null,
	    category: null,
	    created_at: null,
	    updated_at: null,
	    funding_ends_at: null,
	    forever_funding_ends_at: null,
	    currency: null,
	    collected_funds: null,
	    external_campaign_info: null,
	    forever_funding_collected_funds: null,
	    forever_funding_combined_balance: null,
	    goal: null,
	    funding_type: null,
	    forever_funding_active: null,
	    funding_invalid_yet_live: false,
	    perks_available: null,
	    location: null,
	    city: null,
	    description_html: null,
	    contributions_count: null,
	    followed: false,
	    main_video_info: {
	      type: null,
	      id: null
	    },
	    video_overlay_url: null,
	    team_members: [],
	    perks: [],
	    facebook_friend_contributors: [],
	    partner_connected: false,
	    partner: {
	      visible: null,
	      name: null,
	      path: null,
	      square_logo_image_url: null,
	      square_logo_missing_image_url: null
	    },
	    partner_name: null,
	    partner_campaign_page_description: null,
	    partner_image_url: null,
	    nonprofit: false,
	    nonprofit_campaign_page_description: null,
	    affiliated_with_nonprofit: false,
	    status: null,
	    is_pre_order_campaign: null,
	    all_funding_expired: null,
	    visible: false,
	    setCampaignJson: function setCampaignJson(newCampaign) {
	      this.external_campaign_info = newCampaign.external_campaign_info;
	      this.is_external_campaign = newCampaign.is_external_campaign;
	      this.title = newCampaign.title;
	      this.image_types = newCampaign.image_types;
	      this.tagline = newCampaign.tagline;
	      this.category = newCampaign.category && newCampaign.category.slug ? i18n.t(newCampaign.category.slug) : null;
	      this.created_at = new Date(newCampaign.created_at);
	      this.updated_at = new Date(newCampaign.updated_at);
	      this.funding_started_at = new Date(newCampaign.funding_started_at), this.funding_ends_at = newCampaign.funding_ends_at ? new Date(newCampaign.funding_ends_at) : null;
	      this.forever_funding_ends_at = newCampaign.forever_funding_ends_at ? new Date(newCampaign.forever_funding_ends_at) : null;
	      this.location = formatLocation(newCampaign);
	      this.city = newCampaign.city;
	      this.currency = newCampaign.currency;
	      this.collected_funds = newCampaign.collected_funds;
	      this.forever_funding_collected_funds = newCampaign.forever_funding_collected_funds;
	      this.forever_funding_combined_balance = newCampaign.forever_funding_combined_balance;
	      this.goal = newCampaign.goal;
	      this.funding_type = newCampaign.funding_type;
	      this.forever_funding_active = newCampaign.forever_funding_active;
	      this.funding_invalid_yet_live = newCampaign.funding_invalid_yet_live;
	      this.perks_available = newCampaign.perks_available;
	      this.description_html = $sce.trustAsHtml(newCampaign.description_html);
	      this.contributions_count = newCampaign.contributions_count;
	      this.main_video_info = newCampaign.main_video_info;
	      this.video_overlay_url = newCampaign.video_overlay_url;
	      this.facebook_friend_contributors = newCampaign.facebook_friend_contributors;
	      this.team_members = newCampaign.team_members;
	      this.perks = newCampaign.perks;
	      this.tag_list = newCampaign.tag_list;
	      this.non_blacklisted_tags = newCampaign.non_blacklisted_tags;
	      this.partner_connected = !!newCampaign.partner;
	      if (this.partner_connected) {
	        this.partner.visible = newCampaign.partner.visible;
	        this.partner.name = newCampaign.partner.name;
	        this.partner.path = newCampaign.partner.path;
	        this.partner.square_logo_image_url = newCampaign.partner.square_logo_image_url;
	        this.partner.square_logo_missing_image_url = newCampaign.partner.square_logo_missing_image_url;
	      }
	      this.partner_name = newCampaign.partner_name;
	      this.nonprofit = newCampaign.nonprofit;
	      this.status = newCampaign.status;
	      this.is_pre_order_campaign = newCampaign.is_pre_order_campaign;
	      this.is_shipping_now_campaign = newCampaign.is_shipping_now_campaign;
	      this.category_slug = newCampaign.category && newCampaign.category.slug || null;
	      this.category_icon_name = newCampaign.category && newCampaign.category.icon_name || null;
	      this.all_funding_expired = newCampaign.all_funding_expired;
	      this.visible = newCampaign.visible;
	    },
	    follow: function follow(callback) {
	      var newFollowState = true;
	      postFollow(this, gon.urls.campaign_follow_path, newFollowState, callback);
	    },
	    unfollow: function unfollow(callback) {
	      var newFollowState = false;
	      postFollow(this, gon.urls.campaign_unfollow_path, newFollowState, callback);
	    },
	    states: {
	      unknown: -1,
	      draft: 0,
	      published: 1,
	      ended: 2,
	      inDemand: 3,
	      inDemandEnded: 4
	    },
	    state: function state() {
	      if (this.status === 'draft') {
	        return this.states.draft;
	      } else if (this.status === 'published') {
	        if (this.forever_funding_active) {
	          return this.states.inDemand;
	        } else {
	          return this.states.published;
	        }
	      } else if (this.status === 'ended') {
	        if (this.forever_funding_ends_at) {
	          return this.states.inDemandEnded;
	        } else {
	          return this.states.ended;
	        }
	      }
	
	      return this.states.unknown;
	    },
	    isInDemand: function isInDemand() {
	      return this.state() === this.states.inDemand || this.state() === this.states.inDemandEnded;
	    },
	    isTechDesignEligible: function isTechDesignEligible() {
	      return !this.isInDemand() && this.perks_available && /technology|design/.test(this.category_slug) && this.status !== 'ended';
	    }
	  };
	}
	
	module.exports = ['$sce', '$http', 'gon', 'i18n', campaignService];

/***/ },
/* 65 */
/***/ function(module, exports) {

	'use strict';
	
	function trustPassportService(gon) {
	
	  var trust_passport = _.clone(gon.trust_passport);
	
	  var project = _.clone(trust_passport.project);
	  var owner = _.clone(trust_passport.owner);
	  var loggedIn = _.clone(gon.logged_in);
	  var loginUrl = _.clone(gon.login_url);
	
	  var idVerifiedEnabled = trust_passport.identity_verified_enabled;
	  var verifications = getVerifications(owner, idVerifiedEnabled);
	  var hasVerifications = _.any(verifications);
	
	  var recaptchaIdsReady = {};
	
	  var urlMatcher = new RegExp('https?://(?:www.)?(.*)');
	  var websites = _.map(project.websites, function (url) {
	    return {
	      url: url,
	      text: urlMatcher.exec(url)[1]
	    };
	  });
	
	  function getVerifications(teamMember, idVerifiedEnabled) {
	    var verifications = [teamMember.email_verified, teamMember.facebook_verified, teamMember.linkedin_verified];
	
	    if (idVerifiedEnabled) {
	      verifications.push(teamMember.admin_verified);
	    }
	
	    return verifications;
	  }
	
	  return {
	    project: project,
	    owner: owner,
	    loggedIn: loggedIn,
	    loginUrl: loginUrl,
	    idVerifiedEnabled: idVerifiedEnabled,
	    verifications: verifications,
	    hasVerifications: hasVerifications,
	    registerRecaptchaId: function registerRecaptchaId(id) {
	      recaptchaIdsReady[id] = true;
	    },
	    isRecaptchaReadyForId: function isRecaptchaReadyForId(id) {
	      if (_.isUndefined(id)) {
	        return false;
	      }
	      return recaptchaIdsReady[id];
	    },
	    websites: websites,
	    getVerificationsForTeamMember: getVerifications
	  };
	}
	
	module.exports = ['gon', trustPassportService];

/***/ }
/******/ ]);
//# sourceMappingURL=campaign-page-responsive.js.map
