diff --git a/index.js b/index.js index edecddfc..bdf095f6 100644 --- a/index.js +++ b/index.js @@ -1,2 +1,2 @@ -!function(e){function t(a){if(n[a])return n[a].exports;var r=n[a]={i:a,l:!1,exports:{}};return e[a].call(r.exports,r,r.exports,t),r.l=!0,r.exports}var n={};t.m=e,t.c=n,t.d=function(e,n,a){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:a})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="/",t(t.s=43)}([function(e,t){e.exports=require("react")},function(e,t){e.exports=require("react-redux")},function(e,t){e.exports=require("winston")},function(e,t,n){"use strict";e.exports={analytics:{googleId:"UA-60403362-6"},logging:{logLevel:"debug",slackWebHook:"https://hooks.slack.com/services/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",slackErrorChannel:null,slackInfoChannel:"#speech-dev1-errors"},session:{sessionKey:"nans$#kfjanwe234rydns"},files:{uploadDirectory:"/home/lbry/Uploads"},site:{title:"dev1.Spee.ch",name:"dev1.Spee.ch",host:"https://dev1.spee.ch",description:"Open-source, decentralized image and video sharing."},publish:{primaryClaimAddress:"bDZ2wPwtULUGxT7GXuNLpQhXmdPRUTUkcL",additionalClaimAddresses:["banpwixPosfVDWnGvXqU2af36Qpsd7buGd"],thumbnailChannel:"@dev1thumbs",thumbnailChannelId:"aeb625ff6f66c3eeeb42885070f4e53876033626"},claim:{defaultTitle:"dev1 Spee.ch",defaultThumbnail:"https://spee.ch/assets/img/video_thumb_default.png",defaultDescription:"Open-source, decentralized image and video sharing."},testing:{testChannel:"@test",testChannelId:"3b5bc6b6819172c6e2f3f90aa855b14a956b4a82",testChannelPassword:"1234"},api:{apiHost:"localhost",apiPort:"5279"}}},function(e,t){e.exports=require("react-router-dom")},function(e,t,n){"use strict";function a(e){return{type:h.FILE_SELECTED,data:e}}function r(){return{type:h.FILE_CLEAR}}function l(e,t){return{type:h.METADATA_UPDATE,data:{name:e,value:t}}}function o(e){return{type:h.CLAIM_UPDATE,data:e}}function i(e){return{type:h.SET_PUBLISH_IN_CHANNEL,channel:e}}function u(e,t){return{type:h.PUBLISH_STATUS_UPDATE,data:{status:e,message:t}}}function s(e,t){return{type:h.ERROR_UPDATE,data:{name:e,value:t}}}function c(e){return{type:h.SELECTED_CHANNEL_UPDATE,data:e}}function d(e){return{type:h.TOGGLE_METADATA_INPUTS,data:e}}function f(e){return{type:h.THUMBNAIL_NEW,data:e}}function p(e){return{type:h.PUBLISH_START,data:{history:e}}}Object.defineProperty(t,"__esModule",{value:!0}),t.selectFile=a,t.clearFile=r,t.updateMetadata=l,t.updateClaim=o,t.setPublishInChannel=i,t.updatePublishStatus=u,t.updateError=s,t.updateSelectedChannel=c,t.toggleMetadataInputs=d,t.onNewThumbnail=f,t.startPublish=p;var m=n(31),h=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(m)},function(e,t,n){"use strict";var a=n(59),r=n(2);e.exports=function(e){var t=e.database,l=e.username,o=e.password,i={},u=new a(t,l,o,{host:"localhost",dialect:"mysql",dialectOptions:{decimalNumbers:!0},logging:!1,pool:{max:5,min:0,idle:1e4,acquire:1e4}});u.authenticate().then(function(){r.info("Sequelize has established mysql connection successfully.")}).catch(function(e){r.error("Sequelize was unable to connect to the database:",e)});var s=n(60),c=n(61),d=n(62),f=n(63),p=n(64),m=n(65);return i.Certificate=u.import("Certificate",s),i.Channel=u.import("Channel",c),i.Claim=u.import("Claim",d),i.File=u.import("File",f),i.Request=u.import("Request",p),i.User=u.import("User",m),Object.keys(i).forEach(function(e){i[e].associate&&(r.info("Associating model:",e),i[e].associate(i))}),i.sequelize=u,i.Sequelize=a,i.upsert=function(e,t,n,a){return e.findOne({where:n}).then(function(n){return n?(r.debug("updating record in db."+a),n.update(t)):(r.debug("creating record in db."+a),e.create(t))}).catch(function(e){throw r.error(a+".upsert error",e),e})},i}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var a=n(1),r=n(19),l=n(87),o=function(e){return e&&e.__esModule?e:{default:e}}(l),i=n(5),u=function(e){var t=e.channel;return{channelName:t.loggedInChannel.name,channelShortId:t.loggedInChannel.shortId,channelLongId:t.loggedInChannel.longId}},s=function(e){return{onChannelLogin:function(t,n,a){e((0,r.updateLoggedInChannel)(t,n,a)),e((0,i.updateSelectedChannel)(t))},onChannelLogout:function(){e((0,r.updateLoggedInChannel)(null,null,null))}}};t.default=(0,a.connect)(u,s)(o.default)},function(e,t,n){"use strict";function a(e){return{type:g.HANDLE_SHOW_URI,data:e}}function r(e){return{type:g.REQUEST_ERROR,data:e}}function l(e,t){var n=v.CHANNEL,a="cr#"+e+"#"+t;return{type:g.CHANNEL_REQUEST_NEW,data:{requestType:n,requestId:a,channelName:e,channelId:t}}}function o(e,t,n,a,r){var l=r?v.ASSET_LITE:v.ASSET_DETAILS,o="ar#"+e+"#"+t+"#"+n+"#"+a;return{type:g.ASSET_REQUEST_NEW,data:{requestType:l,requestId:o,name:e,modifier:{id:t,channel:{name:n,id:a}}}}}function i(e,t){return{type:g.REQUEST_UPDATE,data:{requestType:e,requestId:t}}}function u(e,t,n){return{type:g.REQUEST_LIST_ADD,data:{id:e,error:t,key:n}}}function s(e,t,n,a,r,l){return{type:g.ASSET_ADD,data:{id:e,error:t,name:n,claimId:a,shortId:r,claimData:l}}}function c(e,t,n,a,r){return{type:g.CHANNEL_ADD,data:{id:e,name:t,shortId:n,longId:a,claimsData:r}}}function d(e,t,n,a){return{type:g.CHANNEL_CLAIMS_UPDATE_ASYNC,data:{channelKey:e,name:t,longId:n,page:a}}}function f(e,t){return{type:g.CHANNEL_CLAIMS_UPDATE_SUCCESS,data:{channelListId:e,claimsData:t}}}function p(e,t){return{type:g.FILE_REQUESTED,data:{name:e,claimId:t}}}function m(e){return{type:g.FILE_AVAILABILITY_UPDATE,data:e}}function h(e){return{type:g.DISPLAY_ASSET_ERROR,data:e}}Object.defineProperty(t,"__esModule",{value:!0}),t.onHandleShowPageUri=a,t.onRequestError=r,t.onNewChannelRequest=l,t.onNewAssetRequest=o,t.onRequestUpdate=i,t.addRequestToRequestList=u,t.addAssetToAssetList=s,t.addNewChannelToChannelList=c,t.onUpdateChannelClaims=d,t.updateChannelClaims=f,t.fileRequested=p,t.updateFileAvailability=m,t.updateDisplayAssetError=h;var b=n(12),g=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(b),v=n(40)},function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function l(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function o(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t){for(var n=0;n=200&&e.status<300)return t;var n=new Error(t.message);throw n.response=e,n}function l(e,t){return fetch(e,t).then(function(e){return Promise.all([e,a(e)])}).then(function(e){var t=o(e,2);return r(t[0],t[1])})}Object.defineProperty(t,"__esModule",{value:!0});var o=function(){function e(e,t){var n=[],a=!0,r=!1,l=void 0;try{for(var o,i=e[Symbol.iterator]();!(a=(o=i.next()).done)&&(n.push(o.value),!t||n.length!==t);a=!0);}catch(e){r=!0,l=e}finally{try{!a&&i.return&&i.return()}finally{if(r)throw l}}return n}return function(t,n){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t))return e(t,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}();t.default=l,n(90)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.HANDLE_SHOW_URI="HANDLE_SHOW_URI",t.REQUEST_ERROR="REQUEST_ERROR",t.REQUEST_UPDATE="REQUEST_UPDATE",t.ASSET_REQUEST_NEW="ASSET_REQUEST_NEW",t.CHANNEL_REQUEST_NEW="CHANNEL_REQUEST_NEW",t.REQUEST_LIST_ADD="REQUEST_LIST_ADD",t.ASSET_ADD="ASSET_ADD",t.CHANNEL_ADD="CHANNEL_ADD",t.CHANNEL_CLAIMS_UPDATE_ASYNC="CHANNEL_CLAIMS_UPDATE_ASYNC",t.CHANNEL_CLAIMS_UPDATE_SUCCESS="CHANNEL_CLAIMS_UPDATE_SUCCESS",t.FILE_REQUESTED="FILE_REQUESTED",t.FILE_AVAILABILITY_UPDATE="FILE_AVAILABILITY_UPDATE",t.DISPLAY_ASSET_ERROR="DISPLAY_ASSET_ERROR"},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.selectAsset=function(e){var t=e.requestList[e.request.id],n=t.key;return e.assetList[n]},t.selectShowState=function(e){return e.show}},function(e,t){e.exports=require("react-helmet")},function(e,t){e.exports=require("redux-saga/effects")},function(e,t,n){"use strict";var a=n(67),r=n(2),l=n(3),o=l.api,i=o.apiHost,u=o.apiPort,s="http://"+i+":"+u,c=n(17),d=c.chooseGaLbrynetPublishLabel,f=c.sendGATimingEvent,p=function(e,t,n){var a=e.data;if(r.debug("lbry api data:",a),a.result)return a.result.error?(r.debug("Lbrynet api error:",a.result.error),void n(new Error(a.result.error))):void t(a.result);n(JSON.stringify(a))};e.exports={publishClaim:function(e){r.debug('lbryApi >> Publishing claim to "'+e.name+'"');var t=Date.now();return new Promise(function(n,r){a.post(s,{method:"publish",params:e}).then(function(a){f("lbrynet","publish",d(e),t,Date.now()),p(a,n,r)}).catch(function(e){r(e)})})},getClaim:function(e){r.debug('lbryApi >> Getting Claim for "'+e+'"');var t=Date.now();return new Promise(function(n,r){a.post(s,{method:"get",params:{uri:e,timeout:20}}).then(function(e){f("lbrynet","getClaim","GET",t,Date.now()),p(e,n,r)}).catch(function(e){r(e)})})},getClaimList:function(e){r.debug('lbryApi >> Getting claim_list for "'+e+'"');var t=Date.now();return new Promise(function(n,r){a.post(s,{method:"claim_list",params:{name:e}}).then(function(e){f("lbrynet","getClaimList","CLAIM_LIST",t,Date.now()),p(e,n,r)}).catch(function(e){r(e)})})},resolveUri:function(e){r.debug('lbryApi >> Resolving URI for "'+e+'"');var t=Date.now();return new Promise(function(n,r){a.post(s,{method:"resolve",params:{uri:e}}).then(function(a){var l=a.data;f("lbrynet","resolveUri","RESOLVE",t,Date.now()),l.result[e].error?r(l.result[e].error):n(l.result[e])}).catch(function(e){r(e)})})},getDownloadDirectory:function(){r.debug("lbryApi >> Retrieving the download directory path from lbry daemon...");var e=Date.now();return new Promise(function(t,n){a.post(s,{method:"settings_get"}).then(function(n){var a=n.data;if(f("lbrynet","getDownloadDirectory","SETTINGS_GET",e,Date.now()),!a.result)return new Error("Successfully connected to lbry daemon, but unable to retrieve the download directory.");t(a.result.download_directory)}).catch(function(e){r.error("Lbrynet Error:",e),t("/home/lbry/Downloads/")})})},createChannel:function(e){r.debug("lbryApi >> Creating channel for "+e+"...");var t=Date.now();return new Promise(function(n,r){a.post(s,{method:"channel_new",params:{channel_name:e,amount:.1}}).then(function(e){f("lbrynet","createChannel","CHANNEL_NEW",t,Date.now()),p(e,n,r)}).catch(function(e){r(e)})})}}},function(e,t,n){"use strict";function a(e,t,n){return{eventCategory:"client requests",eventAction:"serve request",eventLabel:n,ipOverride:t,userAgentOverride:e["user-agent"]}}function r(e,t,n,a,r){return{userTimingCategory:e,userTimingVariableName:t,userTimingTime:r-a,userTimingLabel:n}}function l(e,t){var n=e.replace(/\./g,"-");u(c,n,{strictCidFormat:!1,https:!0}).event(t,function(e){e&&i.error("Google Analytics Event Error >>",e)})}function o(e,t){u(c,e,{strictCidFormat:!1,https:!0}).timing(t,function(e){e&&i.error("Google Analytics Event Error >>",e),i.debug("Timing event successfully sent to google analytics")})}var i=n(2),u=n(68),s=n(3),c=s.analytics.googleId,d=s.site.name;e.exports={sendGAServeEvent:function(e,t,n){l(t,a(e,t,n))},sendGATimingEvent:function(e,t,n,a,l){var i=r(e,t,n,a,l);o(d,i)},chooseGaLbrynetPublishLabel:function(e){var t=e.channel_name,n=e.channel_id;return t||n?"PUBLISH_IN_CHANNEL_CLAIM":"PUBLISH_ANONYMOUS_CLAIM"}}},function(e,t){e.exports=require("redux")},function(e,t,n){"use strict";function a(e,t,n){return{type:l.CHANNEL_UPDATE,data:{name:e,shortId:t,longId:n}}}Object.defineProperty(t,"__esModule",{value:!0}),t.updateLoggedInChannel=a;var r=n(33),l=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(r)},function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function l(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function o(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t){for(var n=0;nthis.props.size)&&(t*=-1,e+=t),n[e].isActive=t>0,e+=t,this.setState({bars:n,incrementer:t,index:e})}},{key:"stopProgressBar",value:function(){clearInterval(this.updateInterval)}},{key:"render",value:function(){return s.default.createElement("div",null,this.state.bars.map(function(e,t){return e.isActive?s.default.createElement(p.default,{key:t}):s.default.createElement(h.default,{key:t})}))}}]),t}(s.default.Component);b.propTypes={size:d.default.number.isRequired},t.default=b},function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function l(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function o(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t){for(var n=0;n0;)r+=1,a=t.substring(0,r),l=l.filter(function(e){return e.claimId&&e.claimId.substring(0,r)===a});return a}}},function(e,t){e.exports=require("passport-local")},function(e,t,n){"use strict";var a=n(2),r=n(74),l=n(3),o=l.site,i=l.wallet,u=l.publish;e.exports={parsePublishApiRequestBody:function(e){var t=e.name,n=e.nsfw,a=e.license,r=e.title,l=e.description,o=e.thumbnail;if(!t)throw new Error("no name field found in request");if(/[^A-Za-z0-9,-]/.exec(t))throw new Error('The claim name you provided is not allowed. Only the following characters are allowed: A-Z, a-z, 0-9, and "-"');return n="true"===n,a=a||null,r=r||null,l=l||null,o=o||null,{name:t,nsfw:n,license:a,title:r,description:l,thumbnail:o}},parsePublishApiRequestFiles:function(t){var n=t.file,a=t.thumbnail;if(!n)throw new Error("no file with key of [file] found in request");if(!n.path)throw new Error("no file path found");if(!n.type)throw new Error("no file type found");if(!n.size)throw new Error("no file type found");if(/'/.test(n.name))throw new Error("apostrophes are not allowed in the file name");return e.exports.validateFileTypeAndSize(n),{fileName:n.name,filePath:n.path,fileType:n.type,thumbnailFileName:a?a.name:null,thumbnailFilePath:a?a.path:null,thumbnailFileType:a?a.type:null}},validateFileTypeAndSize:function(e){switch(e.type){case"image/jpeg":case"image/jpg":case"image/png":if(e.size>1e7)throw a.debug("publish > file validation > .jpeg/.jpg/.png was too big"),new Error("Sorry, images are limited to 10 megabytes.");break;case"image/gif":if(e.size>5e7)throw a.debug("publish > file validation > .gif was too big"),new Error("Sorry, .gifs are limited to 50 megabytes.");break;case"video/mp4":if(e.size>5e7)throw a.debug("publish > file validation > .mp4 was too big"),new Error("Sorry, videos are limited to 50 megabytes.");break;default:throw a.debug("publish > file validation > unrecognized file type"),new Error("The "+e.type+" content type is not supported. Only, .jpeg, .png, .gif, and .mp4 files are currently supported.")}return e},createBasicPublishParams:function(e,t,n,r,l,u,s){a.debug("Creating Publish Parameters"),null!==n&&""!==n.trim()||(n=t),null!==r&&""!==r.trim()||(r=""),null!==l&&""!==l.trim()||(l=" ");var c={name:t,file_path:e,bid:.01,metadata:{description:r,title:n,author:o.title,language:"en",license:l,nsfw:u},claim_address:i.lbryClaimAddress};return s&&(c.metadata.thumbnail=s),c},createThumbnailPublishParams:function(e,t,n,r){if(e)return a.debug("Creating Thumbnail Publish Parameters"),{name:t+"-thumb",file_path:e,bid:.01,metadata:{title:t+" thumbnail",description:"a thumbnail for "+t,author:o.title,language:"en",license:n,nsfw:r},claim_address:i.lbryClaimAddress,channel_name:u.thumbnailChannel,channel_id:u.thumbnailChannelId}},deleteTemporaryFile:function(e){r.unlink(e,function(t){if(t)throw a.error("error deleting temporary file "+e),t;a.debug("successfully deleted "+e)})},addGetResultsToFileData:function(e,t){return e.fileName=t.file_name,e.filePath=t.download_path,e},createFileData:function(e){var t=e.name,n=e.claimId,a=e.outpoint,r=e.height,l=e.address,o=e.nsfw;return{name:t,claimId:n,outpoint:a,height:r,address:l,fileName:"",filePath:"",fileType:e.contentType,nsfw:o}}}},function(e,t,n){"use strict";var a=function(){function e(e,t){var n=[],a=!0,r=!1,l=void 0;try{for(var o,i=e[Symbol.iterator]();!(a=(o=i.next()).done)&&(n.push(o.value),!t||n.length!==t);a=!0);}catch(e){r=!0,l=e}finally{try{!a&&i.return&&i.return()}finally{if(r)throw l}}return n}return function(t,n){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t))return e(t,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),r=n(2);e.exports={handleErrorResponse:function(t,n,l,o){r.error("Error on "+t,e.exports.useObjectPropertiesIfNoKeys(l));var i=e.exports.returnErrorMessageAndStatus(l),u=a(i,2),s=u[0],c=u[1];o.status(s).json(e.exports.createErrorResponsePayload(s,c))},returnErrorMessageAndStatus:function(e){var t=void 0,n=void 0;return"ECONNREFUSED"===e.code?(t=503,n="Connection refused. The daemon may not be running."):(t=400,n=e.message?e.message:e),[t,n]},useObjectPropertiesIfNoKeys:function(e){if(0===Object.keys(e).length){var t={};return Object.getOwnPropertyNames(e).forEach(function(n){t[n]=e[n]}),t}return e},createErrorResponsePayload:function(e,t){return{status:e,success:!1,message:t}}}},function(e,t,n){"use strict";var a=function(){function e(e,t){var n=[],a=!0,r=!1,l=void 0;try{for(var o,i=e[Symbol.iterator]();!(a=(o=i.next()).done)&&(n.push(o.value),!t||n.length!==t);a=!0);}catch(e){r=!0,l=e}finally{try{!a&&i.return&&i.return()}finally{if(r)throw l}}return n}return function(t,n){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t))return e(t,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),r=n(6),l=n(2),o=n(76),i=o.returnPaginatedChannelClaims;e.exports={getClaimId:function(t,n,a,r){return t?e.exports.getClaimIdByChannel(t,n,a):e.exports.getClaimIdByClaim(a,r)},getClaimIdByClaim:function(e,t){return l.debug("getClaimIdByClaim("+e+", "+t+")"),new Promise(function(n,a){r.Claim.getLongClaimId(e,t).then(function(e){e||n("NO_CLAIM"),n(e)}).catch(function(e){a(e)})})},getClaimIdByChannel:function(e,t,n){return l.debug("getClaimIdByChannel("+e+", "+t+", "+n+")"),new Promise(function(l,o){r.Certificate.getLongChannelId(e,t).then(function(e){return e?Promise.all([e,r.Claim.getClaimIdByLongChannelId(e,n)]):[null,null]}).then(function(e){var t=a(e,2),n=t[0],r=t[1];return n?r?void l(r):l("NO_CLAIM"):l("NO_CHANNEL")}).catch(function(e){o(e)})})},getChannelData:function(e,t,n){return new Promise(function(n,l){r.Certificate.getLongChannelId(e,t).then(function(t){return t?Promise.all([t,r.Certificate.getShortChannelIdFromLongChannelId(t,e)]):[null,null,null]}).then(function(t){var r=a(t,2),l=r[0],o=r[1];if(!l)return n("NO_CHANNEL");n({channelName:e,longChannelClaimId:l,shortChannelClaimId:o})}).catch(function(e){l(e)})})},getChannelClaims:function(e,t,n){return new Promise(function(l,o){r.Certificate.getLongChannelId(e,t).then(function(e){return e?Promise.all([e,r.Claim.getAllChannelClaims(e)]):[null,null,null]}).then(function(t){var r=a(t,2),o=r[0],u=r[1];if(!o)return l("NO_CHANNEL");var s=i(e,o,u,n);l(s)}).catch(function(e){o(e)})})},getLocalFileRecord:function(e,t){return r.File.findOne({where:{claimId:e,name:t}}).then(function(e){return e?e.dataValues:"NO_FILE"})}}},function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}var r=n(0),l=a(r),o=n(29),i=n(18),u=n(30),s=a(u),c=n(1),d=n(4),f=n(35),p=a(f),m=n(36),h=a(m),b=n(42),g=a(b),v=n(14),y=a(v);e.exports=function(e,t){var n={},a=(0,i.createStore)(s.default),r=(0,o.renderToString)(l.default.createElement(c.Provider,{store:a},l.default.createElement(d.StaticRouter,{location:e.url,context:n},l.default.createElement(p.default,null,l.default.createElement(h.default,null))))),u=y.default.renderStatic();if(n.url)return t.redirect(301,n.url);var f=a.getState();t.send((0,g.default)(u,r,f))}},function(e,t){e.exports=require("react-dom/server")},function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0});var r=n(18),l=n(78),o=a(l),i=n(79),u=a(i),s=n(80),c=a(s),d=n(81),f=a(d);t.default=(0,r.combineReducers)({channel:u.default,publish:o.default,show:c.default,site:f.default})},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.FILE_SELECTED="FILE_SELECTED",t.FILE_CLEAR="FILE_CLEAR",t.METADATA_UPDATE="METADATA_UPDATE",t.CLAIM_UPDATE="CLAIM_UPDATE",t.SET_PUBLISH_IN_CHANNEL="SET_PUBLISH_IN_CHANNEL",t.PUBLISH_STATUS_UPDATE="PUBLISH_STATUS_UPDATE",t.ERROR_UPDATE="ERROR_UPDATE",t.SELECTED_CHANNEL_UPDATE="SELECTED_CHANNEL_UPDATE",t.TOGGLE_METADATA_INPUTS="TOGGLE_METADATA_INPUTS",t.THUMBNAIL_NEW="THUMBNAIL_NEW",t.PUBLISH_START="PUBLISH_START"},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.LOGIN="Existing",t.CREATE="New"},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.CHANNEL_UPDATE="CHANNEL_UPDATE"},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.LOCAL_CHECK="LOCAL_CHECK",t.UNAVAILABLE="UNAVAILABLE",t.ERROR="ERROR",t.AVAILABLE="AVAILABLE"},function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function l(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function o(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t){for(var n=0;n\n \n \n \n \n \n \x3c!--helmet--\x3e\n '+e.title.toString()+"\n "+e.meta.toString()+"\n "+e.link.toString()+'\n \x3c!--style sheets--\x3e\n \n \n \n \x3c!--google font--\x3e\n \n \n \n
\n
'+t+"
\n
\n \\n \\n \\n \\n ';\n};\n\n/***/ }),\n/* 43 */\n/***/ (function(module, exports, __webpack_require__) {\n\n__webpack_require__(44);\n__webpack_require__(45);\nmodule.exports = __webpack_require__(46);\n\n\n/***/ }),\n/* 44 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"babel-polyfill\");\n\n/***/ }),\n/* 45 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"whatwg-fetch\");\n\n/***/ }),\n/* 46 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\n// load dependencies\nvar express = __webpack_require__(47);\nvar bodyParser = __webpack_require__(48);\nvar expressHandlebars = __webpack_require__(49);\nvar Handlebars = __webpack_require__(50);\n\nvar _require = __webpack_require__(51),\n populateLocalsDotUser = _require.populateLocalsDotUser,\n serializeSpeechUser = _require.serializeSpeechUser,\n deserializeSpeechUser = _require.deserializeSpeechUser;\n\nvar config = __webpack_require__(3);\nvar logger = __webpack_require__(2);\nvar helmet = __webpack_require__(52);\nvar PORT = 3000; // set port\nvar app = express(); // create an Express application\nvar passport = __webpack_require__(22);\nvar cookieSession = __webpack_require__(53);\n\n// configure logging\nvar logLevel = config.logging.logLevel;\n__webpack_require__(54)(logger, logLevel);\n__webpack_require__(55)(logger);\n\n// check for global config variables\n__webpack_require__(57)();\n\n// trust the proxy to get ip address for us\napp.enable('trust proxy');\n\n// add middleware\napp.use(helmet()); // set HTTP headers to protect against well-known web vulnerabilties\napp.use(express.static(__dirname + '/public')); // 'express.static' to serve static files from public directory\napp.use(bodyParser.json()); // 'body parser' for parsing application/json\napp.use(bodyParser.urlencoded({ extended: true })); // 'body parser' for parsing application/x-www-form-urlencoded\napp.use(function (req, res, next) {\n // custom logging middleware to log all incoming http requests\n logger.verbose('Request on ' + req.originalUrl + ' from ' + req.ip);\n next();\n});\n\n// configure passport\npassport.serializeUser(serializeSpeechUser);\npassport.deserializeUser(deserializeSpeechUser);\nvar localSignupStrategy = __webpack_require__(58);\nvar localLoginStrategy = __webpack_require__(69);\npassport.use('local-signup', localSignupStrategy);\npassport.use('local-login', localLoginStrategy);\n// initialize passport\napp.use(cookieSession({\n name: 'session',\n keys: [config.session.sessionKey],\n maxAge: 24 * 60 * 60 * 1000 // 24 hours\n}));\napp.use(passport.initialize());\napp.use(passport.session());\n\n// configure handlebars & register it with express app\nvar hbs = expressHandlebars.create({\n defaultLayout: 'embed', // sets the default layout\n handlebars: Handlebars // includes basic handlebars for access to that library\n});\napp.engine('handlebars', hbs.engine);\napp.set('view engine', 'handlebars');\n\n// middleware to pass user info back to client (for handlebars access), if user is logged in\napp.use(populateLocalsDotUser);\n\n// start the server\nvar startServer = function startServer(mysqlConfig) {\n var db = __webpack_require__(6)(mysqlConfig); // require our models for syncing\n db.sequelize\n // sync sequelize\n .sync()\n // require routes\n .then(function () {\n __webpack_require__(70)(app);\n __webpack_require__(71)(app);\n __webpack_require__(77)(app);\n __webpack_require__(137)(app);\n __webpack_require__(148)(app);\n var http = __webpack_require__(149);\n return http.Server(app);\n })\n // start the server\n .then(function (server) {\n server.listen(PORT, function () {\n logger.info('Trusting proxy?', app.get('trust proxy'));\n logger.info('Server is listening on PORT ' + PORT);\n });\n }).catch(function (error) {\n logger.error('Startup Error:', error);\n });\n};\n\nvar speech = {\n start: function start(config) {\n var mysqlConfig = config.mysqlConfig;\n\n startServer(mysqlConfig);\n }\n};\n\nmodule.exports = speech;\n\n/***/ }),\n/* 47 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"express\");\n\n/***/ }),\n/* 48 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"body-parser\");\n\n/***/ }),\n/* 49 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"express-handlebars\");\n\n/***/ }),\n/* 50 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"handlebars\");\n\n/***/ }),\n/* 51 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\n// const db = require('../models'); // require our models for syncing\nvar logger = __webpack_require__(2);\n\nmodule.exports = {\n populateLocalsDotUser: function populateLocalsDotUser(req, res, next) {\n if (req.user) {\n logger.debug('populating res.locals.user');\n res.locals.user = {\n id: req.user.id,\n userName: req.user.userName,\n channelName: req.user.channelName,\n channelClaimId: req.user.channelClaimId,\n shortChannelId: req.user.shortChannelId\n };\n }\n next();\n },\n serializeSpeechUser: function serializeSpeechUser(user, done) {\n // returns user data to be serialized into session\n logger.debug('serializing user');\n done(null, user);\n },\n deserializeSpeechUser: function deserializeSpeechUser(user, done) {\n // deserializes session and populates additional info to req.user\n logger.debug('deserializing user');\n done(null, user);\n }\n};\n\n/***/ }),\n/* 52 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"helmet\");\n\n/***/ }),\n/* 53 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"cookie-session\");\n\n/***/ }),\n/* 54 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = function (winston, logLevel) {\n winston.configure({\n transports: [new winston.transports.Console({\n level: logLevel,\n timestamp: false,\n colorize: true,\n prettyPrint: true,\n handleExceptions: true,\n humanReadableUnhandledException: true\n })]\n });\n\n winston.error('Level 0');\n winston.warn('Level 1');\n winston.info('Level 2');\n winston.verbose('Level 3');\n winston.debug('Level 4');\n winston.silly('Level 5');\n};\n\n/***/ }),\n/* 55 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _require = __webpack_require__(3),\n logging = _require.logging;\n\nvar slackWebHook = logging.slackWebHook,\n slackErrorChannel = logging.slackErrorChannel,\n slackInfoChannel = logging.slackInfoChannel;\n\nvar winstonSlackWebHook = __webpack_require__(56).SlackWebHook;\n\nmodule.exports = function (winston) {\n if (slackWebHook) {\n // add a transport for errors to slack\n if (slackErrorChannel) {\n winston.add(winstonSlackWebHook, {\n name: 'slack-errors-transport',\n level: 'warn',\n webhookUrl: slackWebHook,\n channel: slackErrorChannel,\n username: 'spee.ch',\n iconEmoji: ':face_with_head_bandage:'\n });\n };\n if (slackInfoChannel) {\n winston.add(winstonSlackWebHook, {\n name: 'slack-info-transport',\n level: 'info',\n webhookUrl: slackWebHook,\n channel: slackInfoChannel,\n username: 'spee.ch',\n iconEmoji: ':nerd_face:'\n });\n };\n // send test message\n winston.error('Slack \"error\" logging is online.');\n winston.info('Slack \"info\" logging is online.');\n } else {\n winston.warn('Slack logging is not enabled because no slackWebHook config var provided.');\n }\n};\n\n/***/ }),\n/* 56 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"winston-slack-webhook\");\n\n/***/ }),\n/* 57 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar config = __webpack_require__(3);\nvar logger = __webpack_require__(2);\n\nmodule.exports = function () {\n // get the config file\n\n for (var configCategoryKey in config) {\n if (config.hasOwnProperty(configCategoryKey)) {\n // get the final variables for each config category\n var configVariables = config[configCategoryKey];\n for (var configVarKey in configVariables) {\n if (configVariables.hasOwnProperty(configVarKey)) {\n // print each variable\n logger.debug('CONFIG CHECK: ' + configCategoryKey + '.' + configVarKey + ' === ' + configVariables[configVarKey]);\n }\n }\n }\n }\n};\n\n/***/ }),\n/* 58 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar db = __webpack_require__(6);\nvar PassportLocalStrategy = __webpack_require__(24).Strategy;\nvar lbryApi = __webpack_require__(16);\nvar logger = __webpack_require__(2);\n\nmodule.exports = new PassportLocalStrategy({\n usernameField: 'username',\n passwordField: 'password'\n}, function (username, password, done) {\n logger.verbose('new channel signup request. user: ' + username + ' pass: ' + password + ' .');\n var userInfo = {};\n // server-side validaton of inputs (username, password)\n\n // create the channel and retrieve the metadata\n return lbryApi.createChannel('@' + username).then(function (tx) {\n // create user record\n var userData = {\n userName: username,\n password: password\n };\n logger.verbose('userData >', userData);\n // create user record\n var channelData = {\n channelName: '@' + username,\n channelClaimId: tx.claim_id\n };\n logger.verbose('channelData >', channelData);\n // create certificate record\n var certificateData = {\n claimId: tx.claim_id,\n name: '@' + username\n // address,\n };\n logger.verbose('certificateData >', certificateData);\n // save user and certificate to db\n return Promise.all([db.User.create(userData), db.Channel.create(channelData), db.Certificate.create(certificateData)]);\n }).then(function (_ref) {\n var _ref2 = _slicedToArray(_ref, 3),\n newUser = _ref2[0],\n newChannel = _ref2[1],\n newCertificate = _ref2[2];\n\n logger.verbose('user and certificate successfully created');\n // store the relevant newUser info to be passed back for req.User\n userInfo['id'] = newUser.id;\n userInfo['userName'] = newUser.userName;\n userInfo['channelName'] = newChannel.channelName;\n userInfo['channelClaimId'] = newChannel.channelClaimId;\n // associate the instances\n return Promise.all([newCertificate.setChannel(newChannel), newChannel.setUser(newUser)]);\n }).then(function () {\n logger.verbose('user and certificate successfully associated');\n return db.Certificate.getShortChannelIdFromLongChannelId(userInfo.channelClaimId, userInfo.channelName);\n }).then(function (shortChannelId) {\n userInfo['shortChannelId'] = shortChannelId;\n return done(null, userInfo);\n }).catch(function (error) {\n logger.error('signup error', error);\n return done(error);\n });\n});\n\n/***/ }),\n/* 59 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"sequelize\");\n\n/***/ }),\n/* 60 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar logger = __webpack_require__(2);\n\nvar _require = __webpack_require__(23),\n returnShortId = _require.returnShortId;\n\nmodule.exports = function (sequelize, _ref) {\n var STRING = _ref.STRING,\n BOOLEAN = _ref.BOOLEAN,\n INTEGER = _ref.INTEGER,\n TEXT = _ref.TEXT,\n DECIMAL = _ref.DECIMAL;\n\n var Certificate = sequelize.define('Certificate', {\n address: {\n type: STRING,\n default: null\n },\n amount: {\n type: DECIMAL(19, 8),\n default: null\n },\n claimId: {\n type: STRING,\n default: null\n },\n claimSequence: {\n type: INTEGER,\n default: null\n },\n decodedClaim: {\n type: BOOLEAN,\n default: null\n },\n depth: {\n type: INTEGER,\n default: null\n },\n effectiveAmount: {\n type: DECIMAL(19, 8),\n default: null\n },\n hasSignature: {\n type: BOOLEAN,\n default: null\n },\n height: {\n type: INTEGER,\n default: null\n },\n hex: {\n type: TEXT('long'),\n default: null\n },\n name: {\n type: STRING,\n default: null\n },\n nout: {\n type: INTEGER,\n default: null\n },\n txid: {\n type: STRING,\n default: null\n },\n validAtHeight: {\n type: INTEGER,\n default: null\n },\n outpoint: {\n type: STRING,\n default: null\n },\n valueVersion: {\n type: STRING,\n default: null\n },\n claimType: {\n type: STRING,\n default: null\n },\n certificateVersion: {\n type: STRING,\n default: null\n },\n keyType: {\n type: STRING,\n default: null\n },\n publicKey: {\n type: TEXT('long'),\n default: null\n }\n }, {\n freezeTableName: true\n });\n\n Certificate.associate = function (db) {\n Certificate.belongsTo(db.Channel, {\n foreignKey: {\n allowNull: true\n }\n });\n };\n\n Certificate.getShortChannelIdFromLongChannelId = function (longChannelId, channelName) {\n var _this = this;\n\n logger.debug('getShortChannelIdFromLongChannelId ' + channelName + ':' + longChannelId);\n return new Promise(function (resolve, reject) {\n _this.findAll({\n where: { name: channelName },\n order: [['height', 'ASC']]\n }).then(function (result) {\n switch (result.length) {\n case 0:\n throw new Error('No channel(s) found with that channel name');\n default:\n return resolve(returnShortId(result, longChannelId));\n }\n }).catch(function (error) {\n reject(error);\n });\n });\n };\n\n Certificate.getLongChannelIdFromShortChannelId = function (channelName, channelClaimId) {\n var _this2 = this;\n\n logger.debug('getLongChannelIdFromShortChannelId(' + channelName + ', ' + channelClaimId + ')');\n return new Promise(function (resolve, reject) {\n _this2.findAll({\n where: {\n name: channelName,\n claimId: {\n $like: channelClaimId + '%'\n }\n },\n order: [['height', 'ASC']]\n }).then(function (result) {\n switch (result.length) {\n case 0:\n return resolve(null);\n default:\n // note results must be sorted\n return resolve(result[0].claimId);\n }\n }).catch(function (error) {\n reject(error);\n });\n });\n };\n\n Certificate.getLongChannelIdFromChannelName = function (channelName) {\n var _this3 = this;\n\n logger.debug('getLongChannelIdFromChannelName(' + channelName + ')');\n return new Promise(function (resolve, reject) {\n _this3.findAll({\n where: { name: channelName },\n order: [['effectiveAmount', 'DESC'], ['height', 'ASC']]\n }).then(function (result) {\n switch (result.length) {\n case 0:\n return resolve(null);\n default:\n return resolve(result[0].claimId);\n }\n }).catch(function (error) {\n reject(error);\n });\n });\n };\n\n Certificate.validateLongChannelId = function (name, claimId) {\n var _this4 = this;\n\n logger.debug('validateLongChannelId(' + name + ', ' + claimId + ')');\n return new Promise(function (resolve, reject) {\n _this4.findOne({\n where: { name: name, claimId: claimId }\n }).then(function (result) {\n if (!result) {\n return resolve(null);\n };\n resolve(claimId);\n }).catch(function (error) {\n reject(error);\n });\n });\n };\n\n Certificate.getLongChannelId = function (channelName, channelClaimId) {\n logger.debug('getLongChannelId(' + channelName + ', ' + channelClaimId + ')');\n if (channelClaimId && channelClaimId.length === 40) {\n // if a full channel id is provided\n return this.validateLongChannelId(channelName, channelClaimId);\n } else if (channelClaimId && channelClaimId.length < 40) {\n // if a short channel id is provided\n return this.getLongChannelIdFromShortChannelId(channelName, channelClaimId);\n } else {\n return this.getLongChannelIdFromChannelName(channelName); // if no channel id provided\n }\n };\n\n return Certificate;\n};\n\n/***/ }),\n/* 61 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = function (sequelize, _ref) {\n var STRING = _ref.STRING;\n\n var Channel = sequelize.define('Channel', {\n channelName: {\n type: STRING,\n allowNull: false\n },\n channelClaimId: {\n type: STRING,\n allowNull: false\n }\n }, {\n freezeTableName: true\n });\n\n Channel.associate = function (db) {\n Channel.belongsTo(db.User);\n Channel.hasOne(db.Certificate);\n };\n\n return Channel;\n};\n\n/***/ }),\n/* 62 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar logger = __webpack_require__(2);\n\nvar _require = __webpack_require__(23),\n returnShortId = _require.returnShortId;\n\nvar _require2 = __webpack_require__(3),\n claim = _require2.claim,\n site = _require2.site;\n\nvar defaultThumbnail = claim.defaultThumbnail;\n\n\nfunction determineFileExtensionFromContentType(contentType) {\n switch (contentType) {\n case 'image/jpeg':\n case 'image/jpg':\n return 'jpeg';\n case 'image/png':\n return 'png';\n case 'image/gif':\n return 'gif';\n case 'video/mp4':\n return 'mp4';\n default:\n logger.debug('setting unknown file type as file extension jpeg');\n return 'jpeg';\n }\n};\n\nfunction determineThumbnail(storedThumbnail, defaultThumbnail) {\n if (storedThumbnail === '') {\n return defaultThumbnail;\n }\n return storedThumbnail;\n};\n\nfunction prepareClaimData(claim) {\n // logger.debug('preparing claim data based on resolved data:', claim);\n claim['thumbnail'] = determineThumbnail(claim.thumbnail, defaultThumbnail);\n claim['fileExt'] = determineFileExtensionFromContentType(claim.contentType);\n claim['host'] = site.host;\n return claim;\n};\n\nmodule.exports = function (sequelize, _ref) {\n var STRING = _ref.STRING,\n BOOLEAN = _ref.BOOLEAN,\n INTEGER = _ref.INTEGER,\n TEXT = _ref.TEXT,\n DECIMAL = _ref.DECIMAL;\n\n var Claim = sequelize.define('Claim', {\n address: {\n type: STRING,\n default: null\n },\n amount: {\n type: DECIMAL(19, 8),\n default: null\n },\n claimId: {\n type: STRING,\n default: null\n },\n claimSequence: {\n type: INTEGER,\n default: null\n },\n decodedClaim: {\n type: BOOLEAN,\n default: null\n },\n depth: {\n type: INTEGER,\n default: null\n },\n effectiveAmount: {\n type: DECIMAL(19, 8),\n default: null\n },\n hasSignature: {\n type: BOOLEAN,\n default: null\n },\n height: {\n type: INTEGER,\n default: null\n },\n hex: {\n type: TEXT('long'),\n default: null\n },\n name: {\n type: STRING,\n default: null\n },\n nout: {\n type: INTEGER,\n default: null\n },\n txid: {\n type: STRING,\n default: null\n },\n validAtHeight: {\n type: INTEGER,\n default: null\n },\n outpoint: {\n type: STRING,\n default: null\n },\n claimType: {\n type: STRING,\n default: null\n },\n certificateId: {\n type: STRING,\n default: null\n },\n author: {\n type: STRING,\n default: null\n },\n description: {\n type: TEXT('long'),\n default: null\n },\n language: {\n type: STRING,\n default: null\n },\n license: {\n type: STRING,\n default: null\n },\n licenseUrl: {\n type: STRING,\n default: null\n },\n nsfw: {\n type: BOOLEAN,\n default: null\n },\n preview: {\n type: STRING,\n default: null\n },\n thumbnail: {\n type: STRING,\n default: null\n },\n title: {\n type: STRING,\n default: null\n },\n metadataVersion: {\n type: STRING,\n default: null\n },\n contentType: {\n type: STRING,\n default: null\n },\n source: {\n type: STRING,\n default: null\n },\n sourceType: {\n type: STRING,\n default: null\n },\n sourceVersion: {\n type: STRING,\n default: null\n },\n streamVersion: {\n type: STRING,\n default: null\n },\n valueVersion: {\n type: STRING,\n default: null\n },\n channelName: {\n type: STRING,\n allowNull: true,\n default: null\n }\n }, {\n freezeTableName: true\n });\n\n Claim.associate = function (db) {\n Claim.belongsTo(db.File, {\n foreignKey: {\n allowNull: true\n }\n });\n };\n\n Claim.getShortClaimIdFromLongClaimId = function (claimId, claimName) {\n var _this = this;\n\n logger.debug('Claim.getShortClaimIdFromLongClaimId for ' + claimName + '#' + claimId);\n return new Promise(function (resolve, reject) {\n _this.findAll({\n where: { name: claimName },\n order: [['height', 'ASC']]\n }).then(function (result) {\n switch (result.length) {\n case 0:\n throw new Error('No claim(s) found with that claim name');\n default:\n resolve(returnShortId(result, claimId));\n }\n }).catch(function (error) {\n reject(error);\n });\n });\n };\n\n Claim.getAllChannelClaims = function (channelClaimId) {\n var _this2 = this;\n\n logger.debug('Claim.getAllChannelClaims for ' + channelClaimId);\n return new Promise(function (resolve, reject) {\n _this2.findAll({\n where: { certificateId: channelClaimId },\n order: [['height', 'ASC']],\n raw: true // returns an array of only data, not an array of instances\n }).then(function (channelClaimsArray) {\n // logger.debug('channelclaimsarray length:', channelClaimsArray.length);\n switch (channelClaimsArray.length) {\n case 0:\n return resolve(null);\n default:\n channelClaimsArray.forEach(function (claim) {\n claim['fileExt'] = determineFileExtensionFromContentType(claim.contentType);\n claim['thumbnail'] = determineThumbnail(claim.thumbnail, defaultThumbnail);\n return claim;\n });\n return resolve(channelClaimsArray);\n }\n }).catch(function (error) {\n reject(error);\n });\n });\n };\n\n Claim.getClaimIdByLongChannelId = function (channelClaimId, claimName) {\n var _this3 = this;\n\n logger.debug('finding claim id for claim ' + claimName + ' from channel ' + channelClaimId);\n return new Promise(function (resolve, reject) {\n _this3.findAll({\n where: { name: claimName, certificateId: channelClaimId },\n order: [['id', 'ASC']]\n }).then(function (result) {\n switch (result.length) {\n case 0:\n return resolve(null);\n case 1:\n return resolve(result[0].claimId);\n default:\n logger.error(result.length + ' records found for \"' + claimName + '\" in channel \"' + channelClaimId + '\"');\n return resolve(result[0].claimId);\n }\n }).catch(function (error) {\n reject(error);\n });\n });\n };\n\n Claim.getLongClaimIdFromShortClaimId = function (name, shortId) {\n var _this4 = this;\n\n return new Promise(function (resolve, reject) {\n _this4.findAll({\n where: {\n name: name,\n claimId: {\n $like: shortId + '%'\n } },\n order: [['height', 'ASC']]\n }).then(function (result) {\n switch (result.length) {\n case 0:\n return resolve(null);\n default:\n // note results must be sorted\n return resolve(result[0].claimId);\n }\n }).catch(function (error) {\n reject(error);\n });\n });\n };\n\n Claim.getTopFreeClaimIdByClaimName = function (name) {\n var _this5 = this;\n\n return new Promise(function (resolve, reject) {\n _this5.findAll({\n where: { name: name },\n order: [['effectiveAmount', 'DESC'], ['height', 'ASC']] // note: maybe height and effective amount need to switch?\n }).then(function (result) {\n logger.debug('length of result', result.length);\n switch (result.length) {\n case 0:\n return resolve(null);\n default:\n return resolve(result[0].dataValues.claimId);\n }\n }).catch(function (error) {\n reject(error);\n });\n });\n };\n\n Claim.validateLongClaimId = function (name, claimId) {\n var _this6 = this;\n\n return new Promise(function (resolve, reject) {\n _this6.findOne({\n where: { name: name, claimId: claimId }\n }).then(function (result) {\n if (!result) {\n return resolve(null);\n };\n resolve(claimId);\n }).catch(function (error) {\n reject(error);\n });\n });\n };\n\n Claim.getLongClaimId = function (claimName, claimId) {\n logger.debug('getLongClaimId(' + claimName + ', ' + claimId + ')');\n if (claimId && claimId.length === 40) {\n // if a full claim id is provided\n return this.validateLongClaimId(claimName, claimId);\n } else if (claimId && claimId.length < 40) {\n return this.getLongClaimIdFromShortClaimId(claimName, claimId); // if a short claim id is provided\n } else {\n return this.getTopFreeClaimIdByClaimName(claimName); // if no claim id is provided\n }\n };\n\n Claim.resolveClaim = function (name, claimId) {\n var _this7 = this;\n\n logger.debug('Claim.resolveClaim: ' + name + ' ' + claimId);\n return new Promise(function (resolve, reject) {\n _this7.findAll({\n where: { name: name, claimId: claimId }\n }).then(function (claimArray) {\n logger.debug('claims found on resolve:', claimArray.length);\n switch (claimArray.length) {\n case 0:\n return resolve(null);\n case 1:\n return resolve(prepareClaimData(claimArray[0].dataValues));\n default:\n logger.error('more than one entry matches that name (' + name + ') and claimID (' + claimId + ')');\n return resolve(prepareClaimData(claimArray[0].dataValues));\n }\n }).catch(function (error) {\n reject(error);\n });\n });\n };\n\n return Claim;\n};\n\n/***/ }),\n/* 63 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = function (sequelize, _ref) {\n var STRING = _ref.STRING,\n BOOLEAN = _ref.BOOLEAN,\n INTEGER = _ref.INTEGER;\n\n var File = sequelize.define('File', {\n name: {\n type: STRING,\n allowNull: false\n },\n claimId: {\n type: STRING,\n allowNull: false\n },\n address: {\n type: STRING,\n allowNull: false\n },\n outpoint: {\n type: STRING,\n allowNull: false\n },\n height: {\n type: INTEGER,\n allowNull: false,\n default: 0\n },\n fileName: {\n type: STRING,\n allowNull: false\n },\n filePath: {\n type: STRING,\n allowNull: false\n },\n fileType: {\n type: STRING\n },\n nsfw: {\n type: BOOLEAN,\n allowNull: false,\n defaultValue: false\n },\n trendingEligible: {\n type: BOOLEAN,\n allowNull: false,\n defaultValue: true\n }\n }, {\n freezeTableName: true\n });\n\n File.associate = function (db) {\n File.hasMany(db.Request);\n File.hasOne(db.Claim);\n };\n\n File.getRecentClaims = function () {\n return this.findAll({\n where: { nsfw: false, trendingEligible: true },\n order: [['createdAt', 'DESC']],\n limit: 25\n });\n };\n\n return File;\n};\n\n/***/ }),\n/* 64 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = function (sequelize, _ref) {\n var STRING = _ref.STRING,\n BOOLEAN = _ref.BOOLEAN,\n TEXT = _ref.TEXT;\n\n var Request = sequelize.define('Request', {\n action: {\n type: STRING,\n allowNull: false\n },\n url: {\n type: STRING,\n allowNull: false\n },\n ipAddress: {\n type: STRING,\n allowNull: true\n },\n result: {\n type: TEXT('long'),\n allowNull: true,\n default: null\n }\n }, {\n freezeTableName: true\n });\n\n Request.associate = function (db) {\n Request.belongsTo(db.File, {\n foreignKey: {\n allowNull: true\n }\n });\n };\n\n return Request;\n};\n\n/***/ }),\n/* 65 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar bcrypt = __webpack_require__(66);\nvar logger = __webpack_require__(2);\n\nmodule.exports = function (sequelize, _ref) {\n var STRING = _ref.STRING;\n\n var User = sequelize.define('User', {\n userName: {\n type: STRING,\n allowNull: false\n },\n password: {\n type: STRING,\n allowNull: false\n }\n }, {\n freezeTableName: true\n });\n\n User.associate = function (db) {\n User.hasOne(db.Channel);\n };\n\n User.prototype.comparePassword = function (password) {\n return bcrypt.compare(password, this.password);\n };\n\n User.prototype.changePassword = function (newPassword) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n // generate a salt string to use for hashing\n bcrypt.genSalt(function (saltError, salt) {\n if (saltError) {\n logger.error('salt error', saltError);\n reject(saltError);\n return;\n }\n // generate a hashed version of the user's password\n bcrypt.hash(newPassword, salt, function (hashError, hash) {\n // if there is an error with the hash generation return the error\n if (hashError) {\n logger.error('hash error', hashError);\n reject(hashError);\n return;\n }\n // replace the current password with the new hash\n _this.update({ password: hash }).then(function () {\n resolve();\n }).catch(function (error) {\n reject(error);\n });\n });\n });\n });\n };\n\n // pre-save hook method to hash the user's password before the user's info is saved to the db.\n User.hook('beforeCreate', function (user, options) {\n logger.debug('User.beforeCreate hook...');\n return new Promise(function (resolve, reject) {\n // generate a salt string to use for hashing\n bcrypt.genSalt(function (saltError, salt) {\n if (saltError) {\n logger.error('salt error', saltError);\n reject(saltError);\n return;\n }\n // generate a hashed version of the user's password\n bcrypt.hash(user.password, salt, function (hashError, hash) {\n // if there is an error with the hash generation return the error\n if (hashError) {\n logger.error('hash error', hashError);\n reject(hashError);\n return;\n }\n // replace the password string with the hash password value\n user.password = hash;\n resolve();\n });\n });\n });\n });\n\n return User;\n};\n\n/***/ }),\n/* 66 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"bcrypt\");\n\n/***/ }),\n/* 67 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"axios\");\n\n/***/ }),\n/* 68 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"universal-analytics\");\n\n/***/ }),\n/* 69 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar PassportLocalStrategy = __webpack_require__(24).Strategy;\nvar db = __webpack_require__(6);\nvar logger = __webpack_require__(2);\n\nfunction returnUserAndChannelInfo(userInstance) {\n return new Promise(function (resolve, reject) {\n var userInfo = {};\n userInfo['id'] = userInstance.id;\n userInfo['userName'] = userInstance.userName;\n userInstance.getChannel().then(function (_ref) {\n var channelName = _ref.channelName,\n channelClaimId = _ref.channelClaimId;\n\n userInfo['channelName'] = channelName;\n userInfo['channelClaimId'] = channelClaimId;\n return db.Certificate.getShortChannelIdFromLongChannelId(channelClaimId, channelName);\n }).then(function (shortChannelId) {\n userInfo['shortChannelId'] = shortChannelId;\n resolve(userInfo);\n }).catch(function (error) {\n reject(error);\n });\n });\n}\n\nmodule.exports = new PassportLocalStrategy({\n usernameField: 'username',\n passwordField: 'password'\n}, function (username, password, done) {\n return db.User.findOne({\n where: { userName: username }\n }).then(function (user) {\n if (!user) {\n logger.debug('no user found');\n return done(null, false, { message: 'Incorrect username or password' });\n }\n return user.comparePassword(password).then(function (isMatch) {\n if (!isMatch) {\n logger.debug('incorrect password');\n return done(null, false, { message: 'Incorrect username or password' });\n }\n logger.debug('Password was a match, returning User');\n return returnUserAndChannelInfo(user).then(function (userInfo) {\n return done(null, userInfo);\n }).catch(function (error) {\n return error;\n });\n }).catch(function (error) {\n return error;\n });\n }).catch(function (error) {\n return done(error);\n });\n});\n\n/***/ }),\n/* 70 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar logger = __webpack_require__(2);\nvar passport = __webpack_require__(22);\n\nmodule.exports = function (app) {\n // route for sign up\n app.post('/signup', passport.authenticate('local-signup'), function (req, res) {\n logger.verbose('successful signup for ' + req.user.channelName);\n res.status(200).json({\n success: true,\n channelName: req.user.channelName,\n channelClaimId: req.user.channelClaimId,\n shortChannelId: req.user.shortChannelId\n });\n });\n // route for log in\n app.post('/login', function (req, res, next) {\n passport.authenticate('local-login', function (err, user, info) {\n logger.debug('info:', info);\n if (err) {\n return next(err);\n }\n if (!user) {\n return res.status(400).json({\n success: false,\n message: info.message\n });\n }\n logger.debug('successful login');\n req.logIn(user, function (err) {\n if (err) {\n return next(err);\n }\n return res.status(200).json({\n success: true,\n channelName: req.user.channelName,\n channelClaimId: req.user.channelClaimId,\n shortChannelId: req.user.shortChannelId\n });\n });\n })(req, res, next);\n });\n // route to log out\n app.get('/logout', function (req, res) {\n req.logout();\n res.status(200).json({ success: true, message: 'you successfully logged out' });\n });\n // see if user is authenticated, and return credentials if so\n app.get('/user', function (req, res) {\n if (req.user) {\n res.status(200).json({ success: true, data: req.user });\n } else {\n res.status(401).json({ success: false, message: 'user is not logged in' });\n }\n });\n};\n\n/***/ }),\n/* 71 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar logger = __webpack_require__(2);\nvar multipart = __webpack_require__(72);\n\nvar _require = __webpack_require__(3),\n files = _require.files,\n site = _require.site;\n\nvar multipartMiddleware = multipart({ uploadDir: files.uploadDirectory });\nvar db = __webpack_require__(6);\n\nvar _require2 = __webpack_require__(73),\n claimNameIsAvailable = _require2.claimNameIsAvailable,\n checkChannelAvailability = _require2.checkChannelAvailability,\n publish = _require2.publish;\n\nvar _require3 = __webpack_require__(16),\n getClaimList = _require3.getClaimList,\n resolveUri = _require3.resolveUri,\n getClaim = _require3.getClaim;\n\nvar _require4 = __webpack_require__(25),\n addGetResultsToFileData = _require4.addGetResultsToFileData,\n createBasicPublishParams = _require4.createBasicPublishParams,\n createThumbnailPublishParams = _require4.createThumbnailPublishParams,\n parsePublishApiRequestBody = _require4.parsePublishApiRequestBody,\n parsePublishApiRequestFiles = _require4.parsePublishApiRequestFiles,\n createFileData = _require4.createFileData;\n\nvar errorHandlers = __webpack_require__(26);\n\nvar _require5 = __webpack_require__(17),\n sendGATimingEvent = _require5.sendGATimingEvent;\n\nvar _require6 = __webpack_require__(75),\n authenticateUser = _require6.authenticateUser;\n\nvar _require7 = __webpack_require__(27),\n getChannelData = _require7.getChannelData,\n getChannelClaims = _require7.getChannelClaims,\n getClaimId = _require7.getClaimId;\n\nvar NO_CHANNEL = 'NO_CHANNEL';\nvar NO_CLAIM = 'NO_CLAIM';\n\nmodule.exports = function (app) {\n // route to check whether site has published to a channel\n app.get('/api/channel/availability/:name', function (_ref, res) {\n var ip = _ref.ip,\n originalUrl = _ref.originalUrl,\n params = _ref.params;\n\n checkChannelAvailability(params.name).then(function (result) {\n if (result === true) {\n res.status(200).json(true);\n } else {\n res.status(200).json(false);\n }\n }).catch(function (error) {\n errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n });\n });\n // route to get a short channel id from long channel Id\n app.get('/api/channel/short-id/:longId/:name', function (_ref2, res) {\n var ip = _ref2.ip,\n originalUrl = _ref2.originalUrl,\n params = _ref2.params;\n\n db.Certificate.getShortChannelIdFromLongChannelId(params.longId, params.name).then(function (shortId) {\n res.status(200).json(shortId);\n }).catch(function (error) {\n errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n });\n });\n app.get('/api/channel/data/:channelName/:channelClaimId', function (_ref3, res) {\n var ip = _ref3.ip,\n originalUrl = _ref3.originalUrl,\n body = _ref3.body,\n params = _ref3.params;\n\n var channelName = params.channelName;\n var channelClaimId = params.channelClaimId;\n if (channelClaimId === 'none') channelClaimId = null;\n getChannelData(channelName, channelClaimId, 0).then(function (data) {\n if (data === NO_CHANNEL) {\n return res.status(404).json({ success: false, message: 'No matching channel was found' });\n }\n res.status(200).json({ success: true, data: data });\n }).catch(function (error) {\n errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n });\n });\n app.get('/api/channel/claims/:channelName/:channelClaimId/:page', function (_ref4, res) {\n var ip = _ref4.ip,\n originalUrl = _ref4.originalUrl,\n body = _ref4.body,\n params = _ref4.params;\n\n var channelName = params.channelName;\n var channelClaimId = params.channelClaimId;\n if (channelClaimId === 'none') channelClaimId = null;\n var page = params.page;\n getChannelClaims(channelName, channelClaimId, page).then(function (data) {\n if (data === NO_CHANNEL) {\n return res.status(404).json({ success: false, message: 'No matching channel was found' });\n }\n res.status(200).json({ success: true, data: data });\n }).catch(function (error) {\n errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n });\n });\n // route to run a claim_list request on the daemon\n app.get('/api/claim/list/:name', function (_ref5, res) {\n var ip = _ref5.ip,\n originalUrl = _ref5.originalUrl,\n params = _ref5.params;\n\n getClaimList(params.name).then(function (claimsList) {\n res.status(200).json(claimsList);\n }).catch(function (error) {\n errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n });\n });\n // route to get an asset\n app.get('/api/claim/get/:name/:claimId', function (_ref6, res) {\n var ip = _ref6.ip,\n originalUrl = _ref6.originalUrl,\n params = _ref6.params;\n\n var name = params.name;\n var claimId = params.claimId;\n // resolve the claim\n db.Claim.resolveClaim(name, claimId).then(function (resolveResult) {\n // make sure a claim actually exists at that uri\n if (!resolveResult) {\n throw new Error('No matching uri found in Claim table');\n }\n var fileData = createFileData(resolveResult);\n // get the claim\n return Promise.all([fileData, getClaim(name + '#' + claimId)]);\n }).then(function (_ref7) {\n var _ref8 = _slicedToArray(_ref7, 2),\n fileData = _ref8[0],\n getResult = _ref8[1];\n\n fileData = addGetResultsToFileData(fileData, getResult);\n return Promise.all([db.upsert(db.File, fileData, { name: name, claimId: claimId }, 'File'), getResult]);\n }).then(function (_ref9) {\n var _ref10 = _slicedToArray(_ref9, 2),\n fileRecord = _ref10[0],\n _ref10$ = _ref10[1],\n message = _ref10$.message,\n completed = _ref10$.completed;\n\n res.status(200).json({ success: true, message: message, completed: completed });\n }).catch(function (error) {\n errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n });\n });\n // route to check whether this site published to a claim\n app.get('/api/claim/availability/:name', function (_ref11, res) {\n var ip = _ref11.ip,\n originalUrl = _ref11.originalUrl,\n params = _ref11.params;\n\n claimNameIsAvailable(params.name).then(function (result) {\n res.status(200).json(result);\n }).catch(function (error) {\n errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n });\n });\n // route to run a resolve request on the daemon\n app.get('/api/claim/resolve/:name/:claimId', function (_ref12, res) {\n var headers = _ref12.headers,\n ip = _ref12.ip,\n originalUrl = _ref12.originalUrl,\n params = _ref12.params;\n\n resolveUri(params.name + '#' + params.claimId).then(function (resolvedUri) {\n res.status(200).json(resolvedUri);\n }).catch(function (error) {\n errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n });\n });\n // route to run a publish request on the daemon\n app.post('/api/claim/publish', multipartMiddleware, function (_ref13, res) {\n var body = _ref13.body,\n files = _ref13.files,\n headers = _ref13.headers,\n ip = _ref13.ip,\n originalUrl = _ref13.originalUrl,\n user = _ref13.user;\n\n logger.debug('api/claim/publish req.body:', body);\n logger.debug('api/claim/publish req.files:', files);\n // define variables\n var channelName = void 0,\n channelId = void 0,\n channelPassword = void 0,\n description = void 0,\n fileName = void 0,\n filePath = void 0,\n fileType = void 0,\n gaStartTime = void 0,\n license = void 0,\n name = void 0,\n nsfw = void 0,\n thumbnail = void 0,\n thumbnailFileName = void 0,\n thumbnailFilePath = void 0,\n thumbnailFileType = void 0,\n title = void 0;\n // record the start time of the request\n gaStartTime = Date.now();\n // validate the body and files of the request\n try {\n var _parsePublishApiReque = parsePublishApiRequestBody(body);\n // validateApiPublishRequest(body, files);\n\n\n name = _parsePublishApiReque.name;\n nsfw = _parsePublishApiReque.nsfw;\n license = _parsePublishApiReque.license;\n title = _parsePublishApiReque.title;\n description = _parsePublishApiReque.description;\n thumbnail = _parsePublishApiReque.thumbnail;\n\n var _parsePublishApiReque2 = parsePublishApiRequestFiles(files);\n\n fileName = _parsePublishApiReque2.fileName;\n filePath = _parsePublishApiReque2.filePath;\n fileType = _parsePublishApiReque2.fileType;\n thumbnailFileName = _parsePublishApiReque2.thumbnailFileName;\n thumbnailFilePath = _parsePublishApiReque2.thumbnailFilePath;\n thumbnailFileType = _parsePublishApiReque2.thumbnailFileType;\n channelName = body.channelName;\n channelId = body.channelId;\n channelPassword = body.channelPassword;\n } catch (error) {\n return res.status(400).json({ success: false, message: error.message });\n }\n // check channel authorization\n Promise.all([authenticateUser(channelName, channelId, channelPassword, user), claimNameIsAvailable(name), createBasicPublishParams(filePath, name, title, description, license, nsfw, thumbnail), createThumbnailPublishParams(thumbnailFilePath, name, license, nsfw)]).then(function (_ref14) {\n var _ref15 = _slicedToArray(_ref14, 4),\n _ref15$ = _ref15[0],\n channelName = _ref15$.channelName,\n channelClaimId = _ref15$.channelClaimId,\n validatedClaimName = _ref15[1],\n publishParams = _ref15[2],\n thumbnailPublishParams = _ref15[3];\n\n // add channel details to the publish params\n if (channelName && channelClaimId) {\n publishParams['channel_name'] = channelName;\n publishParams['channel_id'] = channelClaimId;\n }\n // publish the thumbnail\n if (thumbnailPublishParams) {\n publish(thumbnailPublishParams, thumbnailFileName, thumbnailFileType);\n }\n // publish the asset\n return publish(publishParams, fileName, fileType);\n }).then(function (result) {\n res.status(200).json({\n success: true,\n message: 'publish completed successfully',\n data: {\n name: name,\n claimId: result.claim_id,\n url: site.host + '/' + result.claim_id + '/' + name,\n lbryTx: result\n }\n });\n // record the publish end time and send to google analytics\n sendGATimingEvent('end-to-end', 'publish', fileType, gaStartTime, Date.now());\n }).catch(function (error) {\n errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n });\n });\n // route to get a short claim id from long claim Id\n app.get('/api/claim/short-id/:longId/:name', function (_ref16, res) {\n var ip = _ref16.ip,\n originalUrl = _ref16.originalUrl,\n body = _ref16.body,\n params = _ref16.params;\n\n db.Claim.getShortClaimIdFromLongClaimId(params.longId, params.name).then(function (shortId) {\n res.status(200).json({ success: true, data: shortId });\n }).catch(function (error) {\n errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n });\n });\n app.post('/api/claim/long-id', function (_ref17, res) {\n var ip = _ref17.ip,\n originalUrl = _ref17.originalUrl,\n body = _ref17.body,\n params = _ref17.params;\n\n logger.debug('body:', body);\n var channelName = body.channelName;\n var channelClaimId = body.channelClaimId;\n var claimName = body.claimName;\n var claimId = body.claimId;\n getClaimId(channelName, channelClaimId, claimName, claimId).then(function (result) {\n if (result === NO_CHANNEL) {\n return res.status(404).json({ success: false, message: 'No matching channel could be found' });\n }\n if (result === NO_CLAIM) {\n return res.status(404).json({ success: false, message: 'No matching claim id could be found' });\n }\n res.status(200).json({ success: true, data: result });\n }).catch(function (error) {\n errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n });\n });\n app.get('/api/claim/data/:claimName/:claimId', function (_ref18, res) {\n var ip = _ref18.ip,\n originalUrl = _ref18.originalUrl,\n body = _ref18.body,\n params = _ref18.params;\n\n var claimName = params.claimName;\n var claimId = params.claimId;\n if (claimId === 'none') claimId = null;\n db.Claim.resolveClaim(claimName, claimId).then(function (claimInfo) {\n if (!claimInfo) {\n return res.status(404).json({ success: false, message: 'No claim could be found' });\n }\n res.status(200).json({ success: true, data: claimInfo });\n }).catch(function (error) {\n errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n });\n });\n // route to see if asset is available locally\n app.get('/api/file/availability/:name/:claimId', function (_ref19, res) {\n var ip = _ref19.ip,\n originalUrl = _ref19.originalUrl,\n params = _ref19.params;\n\n var name = params.name;\n var claimId = params.claimId;\n db.File.findOne({ where: { name: name, claimId: claimId } }).then(function (result) {\n if (result) {\n return res.status(200).json({ success: true, data: true });\n }\n res.status(200).json({ success: true, data: false });\n }).catch(function (error) {\n errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n });\n });\n};\n\n/***/ }),\n/* 72 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"connect-multiparty\");\n\n/***/ }),\n/* 73 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar logger = __webpack_require__(2);\nvar db = __webpack_require__(6);\nvar lbryApi = __webpack_require__(16);\nvar publishHelpers = __webpack_require__(25);\nvar config = __webpack_require__(3);\n\nmodule.exports = {\n publish: function publish(publishParams, fileName, fileType) {\n return new Promise(function (resolve, reject) {\n var publishResults = void 0,\n certificateId = void 0,\n channelName = void 0;\n // publish the file\n return lbryApi.publishClaim(publishParams).then(function (tx) {\n logger.info('Successfully published ' + publishParams.name + ' ' + fileName, tx);\n publishResults = tx;\n // get the channel information\n if (publishParams.channel_name) {\n logger.debug('this claim was published in channel: ' + publishParams.channel_name);\n return db.Channel.findOne({ where: { channelName: publishParams.channel_name } });\n } else {\n logger.debug('this claim was not published in a channel');\n return null;\n }\n }).then(function (channel) {\n // set channel information\n certificateId = null;\n channelName = null;\n if (channel) {\n certificateId = channel.channelClaimId;\n channelName = channel.channelName;\n }\n logger.debug('certificateId: ' + certificateId);\n }).then(function () {\n // create the File record\n var fileRecord = {\n name: publishParams.name,\n claimId: publishResults.claim_id,\n title: publishParams.metadata.title,\n description: publishParams.metadata.description,\n address: publishParams.claim_address,\n outpoint: publishResults.txid + ':' + publishResults.nout,\n height: 0,\n fileName: fileName,\n filePath: publishParams.file_path,\n fileType: fileType,\n nsfw: publishParams.metadata.nsfw\n };\n // create the Claim record\n var claimRecord = {\n name: publishParams.name,\n claimId: publishResults.claim_id,\n title: publishParams.metadata.title,\n description: publishParams.metadata.description,\n address: publishParams.claim_address,\n thumbnail: publishParams.metadata.thumbnail,\n outpoint: publishResults.txid + ':' + publishResults.nout,\n height: 0,\n contentType: fileType,\n nsfw: publishParams.metadata.nsfw,\n amount: publishParams.bid,\n certificateId: certificateId,\n channelName: channelName\n };\n // upsert criteria\n var upsertCriteria = {\n name: publishParams.name,\n claimId: publishResults.claim_id\n };\n // upsert the records\n return Promise.all([db.upsert(db.File, fileRecord, upsertCriteria, 'File'), db.upsert(db.Claim, claimRecord, upsertCriteria, 'Claim')]);\n }).then(function (_ref) {\n var _ref2 = _slicedToArray(_ref, 2),\n file = _ref2[0],\n claim = _ref2[1];\n\n logger.debug('File and Claim records successfully created');\n return Promise.all([file.setClaim(claim), claim.setFile(file)]);\n }).then(function () {\n logger.debug('File and Claim records successfully associated');\n resolve(publishResults); // resolve the promise with the result from lbryApi.publishClaim;\n }).catch(function (error) {\n logger.error('PUBLISH ERROR', error);\n publishHelpers.deleteTemporaryFile(publishParams.file_path); // delete the local file\n reject(error);\n });\n });\n },\n claimNameIsAvailable: function claimNameIsAvailable(name) {\n // find any records where the name is used\n return db.File.findAll({ where: { name: name } }).then(function (result) {\n if (result.length >= 1) {\n var claimAddress = config.wallet.lbryClaimAddress;\n // filter out any results that were not published from spee.ch's wallet address\n var filteredResult = result.filter(function (claim) {\n return claim.address === claimAddress;\n });\n // return based on whether any non-spee.ch claims were left\n if (filteredResult.length >= 1) {\n throw new Error('That claim is already in use');\n };\n return name;\n };\n return name;\n });\n },\n checkChannelAvailability: function checkChannelAvailability(name) {\n return new Promise(function (resolve, reject) {\n // find any records where the name is used\n db.Channel.findAll({ where: { channelName: name } }).then(function (result) {\n if (result.length >= 1) {\n return resolve(false);\n }\n resolve(true);\n }).catch(function (error) {\n reject(error);\n });\n });\n }\n};\n\n/***/ }),\n/* 74 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"fs\");\n\n/***/ }),\n/* 75 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar db = __webpack_require__(6);\nvar logger = __webpack_require__(2);\n\nmodule.exports = {\n authenticateUser: function authenticateUser(channelName, channelId, channelPassword, user) {\n // case: no channelName or channel Id are provided (anonymous), regardless of whether user token is provided\n if (!channelName && !channelId) {\n return {\n channelName: null,\n channelClaimId: null\n };\n }\n // case: channelName or channel Id are provided with user token\n if (user) {\n if (channelName && channelName !== user.channelName) {\n throw new Error('the provided channel name does not match user credentials');\n }\n if (channelId && channelId !== user.channelClaimId) {\n throw new Error('the provided channel id does not match user credentials');\n }\n return {\n channelName: user.channelName,\n channelClaimId: user.channelClaimId\n };\n }\n // case: channelName or channel Id are provided with password instead of user token\n if (!channelPassword) throw new Error('no channel password provided');\n return module.exports.authenticateChannelCredentials(channelName, channelId, channelPassword);\n },\n authenticateChannelCredentials: function authenticateChannelCredentials(channelName, channelId, userPassword) {\n return new Promise(function (resolve, reject) {\n // hoisted variables\n var channelData = void 0;\n // build the params for finding the channel\n var channelFindParams = {};\n if (channelName) channelFindParams['channelName'] = channelName;\n if (channelId) channelFindParams['channelClaimId'] = channelId;\n // find the channel\n db.Channel.findOne({\n where: channelFindParams\n }).then(function (channel) {\n if (!channel) {\n logger.debug('no channel found');\n throw new Error('Authentication failed, you do not have access to that channel');\n }\n channelData = channel.get();\n logger.debug('channel data:', channelData);\n return db.User.findOne({\n where: { userName: channelData.channelName.substring(1) }\n });\n }).then(function (user) {\n if (!user) {\n logger.debug('no user found');\n throw new Error('Authentication failed, you do not have access to that channel');\n }\n return user.comparePassword(userPassword);\n }).then(function (isMatch) {\n if (!isMatch) {\n logger.debug('incorrect password');\n throw new Error('Authentication failed, you do not have access to that channel');\n }\n logger.debug('...password was a match...');\n resolve(channelData);\n }).catch(function (error) {\n reject(error);\n });\n });\n }\n};\n\n/***/ }),\n/* 76 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar CLAIMS_PER_PAGE = 12;\n\nmodule.exports = {\n returnPaginatedChannelClaims: function returnPaginatedChannelClaims(channelName, longChannelClaimId, claims, page) {\n var totalPages = module.exports.determineTotalPages(claims);\n var paginationPage = module.exports.getPageFromQuery(page);\n var viewData = {\n channelName: channelName,\n longChannelClaimId: longChannelClaimId,\n claims: module.exports.extractPageFromClaims(claims, paginationPage),\n previousPage: module.exports.determinePreviousPage(paginationPage),\n currentPage: paginationPage,\n nextPage: module.exports.determineNextPage(totalPages, paginationPage),\n totalPages: totalPages,\n totalResults: module.exports.determineTotalClaims(claims)\n };\n return viewData;\n },\n getPageFromQuery: function getPageFromQuery(page) {\n if (page) {\n return parseInt(page);\n }\n return 1;\n },\n extractPageFromClaims: function extractPageFromClaims(claims, pageNumber) {\n if (!claims) {\n return []; // if no claims, return this default\n }\n // logger.debug('claims is array?', Array.isArray(claims));\n // logger.debug(`pageNumber ${pageNumber} is number?`, Number.isInteger(pageNumber));\n var claimStartIndex = (pageNumber - 1) * CLAIMS_PER_PAGE;\n var claimEndIndex = claimStartIndex + CLAIMS_PER_PAGE;\n var pageOfClaims = claims.slice(claimStartIndex, claimEndIndex);\n return pageOfClaims;\n },\n determineTotalPages: function determineTotalPages(claims) {\n if (!claims) {\n return 0;\n } else {\n var totalClaims = claims.length;\n if (totalClaims < CLAIMS_PER_PAGE) {\n return 1;\n }\n var fullPages = Math.floor(totalClaims / CLAIMS_PER_PAGE);\n var remainder = totalClaims % CLAIMS_PER_PAGE;\n if (remainder === 0) {\n return fullPages;\n }\n return fullPages + 1;\n }\n },\n determinePreviousPage: function determinePreviousPage(currentPage) {\n if (currentPage === 1) {\n return null;\n }\n return currentPage - 1;\n },\n determineNextPage: function determineNextPage(totalPages, currentPage) {\n if (currentPage === totalPages) {\n return null;\n }\n return currentPage + 1;\n },\n determineTotalClaims: function determineTotalClaims(claims) {\n if (!claims) {\n return 0;\n }\n return claims.length;\n }\n};\n\n/***/ }),\n/* 77 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _require = __webpack_require__(3),\n site = _require.site;\n\nvar handlePageRender = __webpack_require__(28);\n\nmodule.exports = function (app) {\n // route for the home page\n app.get('/', function (req, res) {\n handlePageRender(req, res);\n });\n // route to display login page\n app.get('/login', function (req, res) {\n handlePageRender(req, res);\n });\n // route to show 'about' page\n app.get('/about', function (req, res) {\n handlePageRender(req, res);\n });\n // route to display a list of the trending images\n app.get('/trending', function (req, res) {\n res.status(301).redirect('/popular');\n });\n app.get('/popular', function (req, res) {\n handlePageRender(req, res);\n });\n // route to display a list of the trending images\n app.get('/new', function (req, res) {\n handlePageRender(req, res);\n });\n // route to send embedable video player (for twitter)\n app.get('/embed/:claimId/:name', function (_ref, res) {\n var params = _ref.params;\n\n var claimId = params.claimId;\n var name = params.name;\n var host = site.host;\n // get and render the content\n res.status(200).render('embed', { layout: 'embed', host: host, claimId: claimId, name: name });\n });\n};\n\n/***/ }),\n/* 78 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function () {\n var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : initialState;\n var action = arguments[1];\n\n switch (action.type) {\n case actions.FILE_SELECTED:\n return Object.assign({}, initialState, { // note: clears to initial state\n file: action.data\n });\n case actions.FILE_CLEAR:\n return initialState;\n case actions.METADATA_UPDATE:\n return Object.assign({}, state, {\n metadata: Object.assign({}, state.metadata, _defineProperty({}, action.data.name, action.data.value))\n });\n case actions.CLAIM_UPDATE:\n return Object.assign({}, state, {\n claim: action.data\n });\n case actions.SET_PUBLISH_IN_CHANNEL:\n return Object.assign({}, state, {\n publishInChannel: action.channel\n });\n case actions.PUBLISH_STATUS_UPDATE:\n return Object.assign({}, state, {\n status: action.data\n });\n case actions.ERROR_UPDATE:\n return Object.assign({}, state, {\n error: Object.assign({}, state.error, _defineProperty({}, action.data.name, action.data.value))\n });\n case actions.SELECTED_CHANNEL_UPDATE:\n return Object.assign({}, state, {\n selectedChannel: action.data\n });\n case actions.TOGGLE_METADATA_INPUTS:\n return Object.assign({}, state, {\n showMetadataInputs: action.data\n });\n case actions.THUMBNAIL_NEW:\n return Object.assign({}, state, {\n thumbnail: action.data\n });\n default:\n return state;\n }\n};\n\nvar _publish_action_types = __webpack_require__(31);\n\nvar actions = _interopRequireWildcard(_publish_action_types);\n\nvar _publish_channel_select_states = __webpack_require__(32);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nvar _require = __webpack_require__(3),\n publish = _require.publish;\n\nvar initialState = {\n publishInChannel: false,\n selectedChannel: _publish_channel_select_states.LOGIN,\n showMetadataInputs: false,\n status: {\n status: null,\n message: null\n },\n error: {\n file: null,\n url: null,\n channel: null,\n publishSubmit: null\n },\n file: null,\n claim: '',\n metadata: {\n title: '',\n description: '',\n license: '',\n nsfw: false\n },\n thumbnailChannel: publish.thumbnailChannel,\n thumbnailChannelId: publish.thumbnailChannelId,\n thumbnail: null\n};\n\n/***/ }),\n/* 79 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function () {\n var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : initialState;\n var action = arguments[1];\n\n switch (action.type) {\n case actions.CHANNEL_UPDATE:\n return Object.assign({}, state, {\n loggedInChannel: action.data\n });\n default:\n return state;\n }\n};\n\nvar _channel_action_types = __webpack_require__(33);\n\nvar actions = _interopRequireWildcard(_channel_action_types);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nvar initialState = {\n loggedInChannel: {\n name: null,\n shortId: null,\n longId: null\n }\n};\n\n/***/ }),\n/* 80 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function () {\n var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : initialState;\n var action = arguments[1];\n\n switch (action.type) {\n // handle request\n case actions.REQUEST_ERROR:\n return Object.assign({}, state, {\n request: Object.assign({}, state.request, {\n error: action.data\n })\n });\n case actions.REQUEST_UPDATE:\n return Object.assign({}, state, {\n request: Object.assign({}, state.request, {\n type: action.data.requestType,\n id: action.data.requestId\n })\n });\n // store requests\n case actions.REQUEST_LIST_ADD:\n return Object.assign({}, state, {\n requestList: Object.assign({}, state.requestList, _defineProperty({}, action.data.id, {\n error: action.data.error,\n key: action.data.key\n }))\n });\n // asset data\n case actions.ASSET_ADD:\n return Object.assign({}, state, {\n assetList: Object.assign({}, state.assetList, _defineProperty({}, action.data.id, {\n error: action.data.error,\n name: action.data.name,\n claimId: action.data.claimId,\n shortId: action.data.shortId,\n claimData: action.data.claimData\n }))\n });\n // channel data\n case actions.CHANNEL_ADD:\n return Object.assign({}, state, {\n channelList: Object.assign({}, state.channelList, _defineProperty({}, action.data.id, {\n name: action.data.name,\n longId: action.data.longId,\n shortId: action.data.shortId,\n claimsData: action.data.claimsData\n }))\n });\n case actions.CHANNEL_CLAIMS_UPDATE_SUCCESS:\n return Object.assign({}, state, {\n channelList: Object.assign({}, state.channelList, _defineProperty({}, action.data.channelListId, Object.assign({}, state.channelList[action.data.channelListId], {\n claimsData: action.data.claimsData\n })))\n });\n // display an asset\n case actions.FILE_AVAILABILITY_UPDATE:\n return Object.assign({}, state, {\n displayAsset: Object.assign({}, state.displayAsset, {\n status: action.data\n })\n });\n case actions.DISPLAY_ASSET_ERROR:\n return Object.assign({}, state, {\n displayAsset: Object.assign({}, state.displayAsset, {\n error: action.data,\n status: _asset_display_states.ERROR\n })\n });\n default:\n return state;\n }\n};\n\nvar _show_action_types = __webpack_require__(12);\n\nvar actions = _interopRequireWildcard(_show_action_types);\n\nvar _asset_display_states = __webpack_require__(34);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nvar initialState = {\n request: {\n error: null,\n type: null,\n id: null\n },\n requestList: {},\n channelList: {},\n assetList: {},\n displayAsset: {\n error: null,\n status: _asset_display_states.LOCAL_CHECK\n }\n};\n\n/***/ }),\n/* 81 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function () {\n var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : initialState;\n var action = arguments[1];\n\n switch (action.type) {\n default:\n return state;\n }\n};\n\nvar _require = __webpack_require__(3),\n site = _require.site;\n\nvar initialState = {\n host: site.host\n};\n\n/***/ }),\n/* 82 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"react-ga\");\n\n/***/ }),\n/* 83 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _SEO = __webpack_require__(9);\n\nvar _SEO2 = _interopRequireDefault(_SEO);\n\nvar _NavBar = __webpack_require__(7);\n\nvar _NavBar2 = _interopRequireDefault(_NavBar);\n\nvar _PublishTool = __webpack_require__(91);\n\nvar _PublishTool2 = _interopRequireDefault(_PublishTool);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar HomePage = function (_React$Component) {\n _inherits(HomePage, _React$Component);\n\n function HomePage() {\n _classCallCheck(this, HomePage);\n\n return _possibleConstructorReturn(this, (HomePage.__proto__ || Object.getPrototypeOf(HomePage)).apply(this, arguments));\n }\n\n _createClass(HomePage, [{\n key: 'render',\n value: function render() {\n return _react2.default.createElement(\n 'div',\n { className: 'row row--tall flex-container--column' },\n _react2.default.createElement(_SEO2.default, null),\n _react2.default.createElement(_NavBar2.default, null),\n _react2.default.createElement(\n 'div',\n { className: 'row row--tall row--padded flex-container--column' },\n _react2.default.createElement(_PublishTool2.default, null)\n )\n );\n }\n }]);\n\n return HomePage;\n}(_react2.default.Component);\n\n;\n\nexports.default = HomePage;\n\n/***/ }),\n/* 84 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _require = __webpack_require__(3),\n siteTitle = _require.site.title;\n\nvar createPageTitle = exports.createPageTitle = function createPageTitle(pageTitle) {\n if (!pageTitle) {\n return '' + siteTitle;\n }\n return siteTitle + ' - ' + pageTitle;\n};\n\n/***/ }),\n/* 85 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _require = __webpack_require__(3),\n _require$site = _require.site,\n title = _require$site.title,\n host = _require$site.host,\n description = _require$site.description,\n _require$claim = _require.claim,\n defaultThumbnail = _require$claim.defaultThumbnail,\n defaultDescription = _require$claim.defaultDescription;\n\nvar determineOgThumbnailContentType = function determineOgThumbnailContentType(thumbnail) {\n if (thumbnail) {\n var fileExt = thumbnail.substring(thumbnail.lastIndexOf('.'));\n switch (fileExt) {\n case 'jpeg':\n case 'jpg':\n return 'image/jpeg';\n case 'png':\n return 'image/png';\n case 'gif':\n return 'image/gif';\n case 'mp4':\n return 'video/mp4';\n default:\n return 'image/jpeg';\n }\n }\n return '';\n};\n\nvar createBasicMetaTags = function createBasicMetaTags() {\n return [{ property: 'og:title', content: title }, { property: 'og:url', content: host }, { property: 'og:site_name', content: title }, { property: 'og:description', content: description }, { property: 'twitter:site', content: '@spee_ch' }, { property: 'twitter:card', content: 'summary' }];\n};\n\nvar createChannelMetaTags = function createChannelMetaTags(channel) {\n var name = channel.name,\n longId = channel.longId;\n\n return [{ property: 'og:title', content: name + ' on ' + title }, { property: 'og:url', content: host + '/' + name + ':' + longId }, { property: 'og:site_name', content: title }, { property: 'og:description', content: name + ', a channel on ' + title }, { property: 'twitter:site', content: '@spee_ch' }, { property: 'twitter:card', content: 'summary' }];\n};\n\nvar createAssetMetaTags = function createAssetMetaTags(asset) {\n var claimData = asset.claimData;\n var contentType = claimData.contentType;\n\n var embedUrl = host + '/' + claimData.claimId + '/' + claimData.name;\n var showUrl = host + '/' + claimData.claimId + '/' + claimData.name;\n var source = host + '/' + claimData.claimId + '/' + claimData.name + '.' + claimData.fileExt;\n var ogTitle = claimData.title || claimData.name;\n var ogDescription = claimData.description || defaultDescription;\n var ogThumbnailContentType = determineOgThumbnailContentType(claimData.thumbnail);\n var ogThumbnail = claimData.thumbnail || defaultThumbnail;\n var metaTags = [{ property: 'og:title', content: ogTitle }, { property: 'og:url', content: showUrl }, { property: 'og:site_name', content: title }, { property: 'og:description', content: ogDescription }, { property: 'og:image:width', content: 600 }, { property: 'og:image:height', content: 315 }, { property: 'twitter:site', content: '@spee_ch' }];\n if (contentType === 'video/mp4' || contentType === 'video/webm') {\n metaTags.push({ property: 'og:video', content: source });\n metaTags.push({ property: 'og:video:secure_url', content: source });\n metaTags.push({ property: 'og:video:type', content: contentType });\n metaTags.push({ property: 'og:image', content: ogThumbnail });\n metaTags.push({ property: 'og:image:type', content: ogThumbnailContentType });\n metaTags.push({ property: 'og:type', content: 'video' });\n metaTags.push({ property: 'twitter:card', content: 'player' });\n metaTags.push({ property: 'twitter:player', content: embedUrl });\n metaTags.push({ property: 'twitter:player:width', content: 600 });\n metaTags.push({ property: 'twitter:text:player_width', content: 600 });\n metaTags.push({ property: 'twitter:player:height', content: 337 });\n metaTags.push({ property: 'twitter:player:stream', content: source });\n metaTags.push({ property: 'twitter:player:stream:content_type', content: contentType });\n } else {\n metaTags.push({ property: 'og:image', content: source });\n metaTags.push({ property: 'og:image:type', content: contentType });\n metaTags.push({ property: 'og:type', content: 'article' });\n metaTags.push({ property: 'twitter:card', content: 'summary_large_image' });\n }\n return metaTags;\n};\n\nvar createMetaTags = exports.createMetaTags = function createMetaTags(asset, channel) {\n if (asset) {\n return createAssetMetaTags(asset);\n };\n if (channel) {\n return createChannelMetaTags(channel);\n };\n return createBasicMetaTags();\n};\n\n/***/ }),\n/* 86 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _require = __webpack_require__(3),\n host = _require.site.host;\n\nvar createBasicCanonicalLink = function createBasicCanonicalLink(page) {\n if (!page) {\n return '' + host;\n };\n return host + '/' + page;\n};\n\nvar createAssetCanonicalLink = function createAssetCanonicalLink(asset) {\n var channelName = void 0,\n certificateId = void 0,\n name = void 0,\n claimId = void 0;\n if (asset.claimData) {\n var _asset$claimData = asset.claimData;\n channelName = _asset$claimData.channelName;\n certificateId = _asset$claimData.certificateId;\n name = _asset$claimData.name;\n claimId = _asset$claimData.claimId;\n };\n if (channelName) {\n return host + '/' + channelName + ':' + certificateId + '/' + name;\n };\n return host + '/' + claimId + '/' + name;\n};\n\nvar createChannelCanonicalLink = function createChannelCanonicalLink(channel) {\n var name = channel.name,\n longId = channel.longId;\n\n return host + '/' + name + ':' + longId;\n};\n\nvar createCanonicalLink = exports.createCanonicalLink = function createCanonicalLink(asset, channel, page) {\n if (asset) {\n return createAssetCanonicalLink(asset);\n }\n if (channel) {\n return createChannelCanonicalLink(channel);\n }\n if (page) {\n return createBasicCanonicalLink(page);\n }\n return createBasicCanonicalLink();\n};\n\n/***/ }),\n/* 87 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _reactRouterDom = __webpack_require__(4);\n\nvar _Logo = __webpack_require__(88);\n\nvar _Logo2 = _interopRequireDefault(_Logo);\n\nvar _NavBarChannelOptionsDropdown = __webpack_require__(89);\n\nvar _NavBarChannelOptionsDropdown2 = _interopRequireDefault(_NavBarChannelOptionsDropdown);\n\nvar _request = __webpack_require__(11);\n\nvar _request2 = _interopRequireDefault(_request);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar VIEW = 'VIEW';\nvar LOGOUT = 'LOGOUT';\n\nvar NavBar = function (_React$Component) {\n _inherits(NavBar, _React$Component);\n\n function NavBar(props) {\n _classCallCheck(this, NavBar);\n\n var _this = _possibleConstructorReturn(this, (NavBar.__proto__ || Object.getPrototypeOf(NavBar)).call(this, props));\n\n _this.checkForLoggedInUser = _this.checkForLoggedInUser.bind(_this);\n _this.logoutUser = _this.logoutUser.bind(_this);\n _this.handleSelection = _this.handleSelection.bind(_this);\n return _this;\n }\n\n _createClass(NavBar, [{\n key: 'componentDidMount',\n value: function componentDidMount() {\n // check to see if the user is already logged in\n this.checkForLoggedInUser();\n }\n }, {\n key: 'checkForLoggedInUser',\n value: function checkForLoggedInUser() {\n var _this2 = this;\n\n var params = { credentials: 'include' };\n (0, _request2.default)('/user', params).then(function (_ref) {\n var data = _ref.data;\n\n _this2.props.onChannelLogin(data.channelName, data.shortChannelId, data.channelClaimId);\n }).catch(function (error) {\n console.log('/user error:', error.message);\n });\n }\n }, {\n key: 'logoutUser',\n value: function logoutUser() {\n var _this3 = this;\n\n var params = { credentials: 'include' };\n (0, _request2.default)('/logout', params).then(function () {\n _this3.props.onChannelLogout();\n }).catch(function (error) {\n console.log('/logout error', error.message);\n });\n }\n }, {\n key: 'handleSelection',\n value: function handleSelection(event) {\n var value = event.target.selectedOptions[0].value;\n switch (value) {\n case LOGOUT:\n this.logoutUser();\n break;\n case VIEW:\n // redirect to channel page\n this.props.history.push('/' + this.props.channelName + ':' + this.props.channelLongId);\n break;\n default:\n break;\n }\n }\n }, {\n key: 'render',\n value: function render() {\n return _react2.default.createElement(\n 'div',\n { className: 'row row--wide nav-bar' },\n _react2.default.createElement(\n 'div',\n { className: 'row row--padded row--short flex-container--row flex-container--space-between-center' },\n _react2.default.createElement(_Logo2.default, null),\n _react2.default.createElement(\n 'div',\n { className: 'nav-bar--center' },\n _react2.default.createElement(\n 'span',\n { className: 'nav-bar-tagline' },\n 'Open-source, decentralized image and video sharing.'\n )\n ),\n _react2.default.createElement(\n 'div',\n { className: 'nav-bar--right' },\n _react2.default.createElement(\n _reactRouterDom.NavLink,\n { className: 'nav-bar-link link--nav', activeClassName: 'link--nav-active', to: '/', exact: true },\n 'Publish'\n ),\n _react2.default.createElement(\n _reactRouterDom.NavLink,\n { className: 'nav-bar-link link--nav', activeClassName: 'link--nav-active', to: '/about' },\n 'About'\n ),\n this.props.channelName ? _react2.default.createElement(_NavBarChannelOptionsDropdown2.default, {\n channelName: this.props.channelName,\n handleSelection: this.handleSelection,\n defaultSelection: this.props.channelName,\n VIEW: VIEW,\n LOGOUT: LOGOUT\n }) : _react2.default.createElement(\n _reactRouterDom.NavLink,\n { id: 'nav-bar-login-link', className: 'nav-bar-link link--nav', activeClassName: 'link--nav-active', to: '/login' },\n 'Channel'\n )\n )\n )\n );\n }\n }]);\n\n return NavBar;\n}(_react2.default.Component);\n\nexports.default = (0, _reactRouterDom.withRouter)(NavBar);\n\n/***/ }),\n/* 88 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _reactRouterDom = __webpack_require__(4);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction Logo() {\n return _react2.default.createElement(\n 'svg',\n { version: '1.1', id: 'Layer_1', x: '0px', y: '0px', height: '24px', viewBox: '0 0 80 31', enableBackground: 'new 0 0 80 31', className: 'nav-bar-logo' },\n _react2.default.createElement(\n _reactRouterDom.Link,\n { to: '/' },\n _react2.default.createElement(\n 'title',\n null,\n 'Logo'\n ),\n _react2.default.createElement(\n 'desc',\n null,\n 'Spee.ch logo'\n ),\n _react2.default.createElement(\n 'g',\n { id: 'About' },\n _react2.default.createElement(\n 'g',\n { id: 'Publish-Form-V2-_x28_filled_x29_', transform: 'translate(-42.000000, -23.000000)' },\n _react2.default.createElement(\n 'g',\n { id: 'Group-17', transform: 'translate(42.000000, 22.000000)' },\n _react2.default.createElement(\n 'text',\n { transform: 'matrix(1 0 0 1 0 20)', fontSize: '25', fontFamily: 'Roboto' },\n 'Spee 10000000) {\n throw new Error('Sorry, images are limited to 10 megabytes.');\n }\n break;\n case 'image/gif':\n if (file.size > 50000000) {\n throw new Error('Sorry, GIFs are limited to 50 megabytes.');\n }\n break;\n case 'video/mp4':\n if (file.size > 50000000) {\n throw new Error('Sorry, videos are limited to 50 megabytes.');\n }\n break;\n default:\n throw new Error(file.type + ' is not a supported file type. Only, .jpeg, .png, .gif, and .mp4 files are currently supported.');\n }\n }\n};\n\n/***/ }),\n/* 95 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(10);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar Preview = function (_React$Component) {\n _inherits(Preview, _React$Component);\n\n function Preview(props) {\n _classCallCheck(this, Preview);\n\n var _this = _possibleConstructorReturn(this, (Preview.__proto__ || Object.getPrototypeOf(Preview)).call(this, props));\n\n _this.state = {\n imgSource: '',\n defaultThumbnail: '/assets/img/video_thumb_default.png'\n };\n return _this;\n }\n\n _createClass(Preview, [{\n key: 'componentDidMount',\n value: function componentDidMount() {\n this.setPreviewImageSource(this.props.file);\n }\n }, {\n key: 'componentWillReceiveProps',\n value: function componentWillReceiveProps(newProps) {\n if (newProps.file !== this.props.file) {\n this.setPreviewImageSource(newProps.file);\n }\n if (newProps.thumbnail !== this.props.thumbnail) {\n if (newProps.thumbnail) {\n this.setPreviewImageSourceFromFile(newProps.thumbnail);\n } else {\n this.setState({ imgSource: this.state.defaultThumbnail });\n }\n }\n }\n }, {\n key: 'setPreviewImageSourceFromFile',\n value: function setPreviewImageSourceFromFile(file) {\n var _this2 = this;\n\n var previewReader = new FileReader();\n previewReader.readAsDataURL(file);\n previewReader.onloadend = function () {\n _this2.setState({ imgSource: previewReader.result });\n };\n }\n }, {\n key: 'setPreviewImageSource',\n value: function setPreviewImageSource(file) {\n if (file.type !== 'video/mp4') {\n this.setPreviewImageSourceFromFile(file);\n } else {\n if (this.props.thumbnail) {\n this.setPreviewImageSourceFromFile(this.props.thumbnail);\n }\n this.setState({ imgSource: this.state.defaultThumbnail });\n }\n }\n }, {\n key: 'render',\n value: function render() {\n return _react2.default.createElement('img', {\n id: 'dropzone-preview',\n src: this.state.imgSource,\n className: this.props.dimPreview ? 'dim' : '',\n alt: 'publish preview'\n });\n }\n }]);\n\n return Preview;\n}(_react2.default.Component);\n\n;\n\nPreview.propTypes = {\n dimPreview: _propTypes2.default.bool.isRequired,\n file: _propTypes2.default.object.isRequired,\n thumbnail: _propTypes2.default.object\n};\n\nexports.default = Preview;\n\n/***/ }),\n/* 96 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _reactRedux = __webpack_require__(1);\n\nvar _publish = __webpack_require__(5);\n\nvar _view = __webpack_require__(97);\n\nvar _view2 = _interopRequireDefault(_view);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar mapStateToProps = function mapStateToProps(_ref) {\n var channel = _ref.channel,\n publish = _ref.publish;\n\n return {\n file: publish.file\n };\n};\n\nvar mapDispatchToProps = {\n clearFile: _publish.clearFile,\n startPublish: _publish.startPublish\n};\n\nexports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(_view2.default);\n\n/***/ }),\n/* 97 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _reactRouterDom = __webpack_require__(4);\n\nvar _Dropzone = __webpack_require__(37);\n\nvar _Dropzone2 = _interopRequireDefault(_Dropzone);\n\nvar _PublishTitleInput = __webpack_require__(98);\n\nvar _PublishTitleInput2 = _interopRequireDefault(_PublishTitleInput);\n\nvar _PublishUrlInput = __webpack_require__(100);\n\nvar _PublishUrlInput2 = _interopRequireDefault(_PublishUrlInput);\n\nvar _PublishThumbnailInput = __webpack_require__(103);\n\nvar _PublishThumbnailInput2 = _interopRequireDefault(_PublishThumbnailInput);\n\nvar _PublishMetadataInputs = __webpack_require__(105);\n\nvar _PublishMetadataInputs2 = _interopRequireDefault(_PublishMetadataInputs);\n\nvar _ChannelSelect = __webpack_require__(108);\n\nvar _ChannelSelect2 = _interopRequireDefault(_ChannelSelect);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar PublishDetails = function (_React$Component) {\n _inherits(PublishDetails, _React$Component);\n\n function PublishDetails(props) {\n _classCallCheck(this, PublishDetails);\n\n var _this = _possibleConstructorReturn(this, (PublishDetails.__proto__ || Object.getPrototypeOf(PublishDetails)).call(this, props));\n\n _this.onPublishSubmit = _this.onPublishSubmit.bind(_this);\n return _this;\n }\n\n _createClass(PublishDetails, [{\n key: 'onPublishSubmit',\n value: function onPublishSubmit() {\n this.props.startPublish(this.props.history);\n }\n }, {\n key: 'render',\n value: function render() {\n return _react2.default.createElement(\n 'div',\n { className: 'row row--no-bottom' },\n _react2.default.createElement(\n 'div',\n { className: 'column column--10' },\n _react2.default.createElement(_PublishTitleInput2.default, null)\n ),\n _react2.default.createElement(\n 'div',\n { className: 'column column--5 column--sml-10' },\n _react2.default.createElement(\n 'div',\n { className: 'row row--padded' },\n _react2.default.createElement(_Dropzone2.default, null)\n )\n ),\n _react2.default.createElement(\n 'div',\n { className: 'column column--5 column--sml-10 align-content-top' },\n _react2.default.createElement(\n 'div',\n { id: 'publish-active-area', className: 'row row--padded' },\n _react2.default.createElement(\n 'div',\n { className: 'row row--padded row--no-top row--wide' },\n _react2.default.createElement(_PublishUrlInput2.default, null)\n ),\n _react2.default.createElement(\n 'div',\n { className: 'row row--padded row--no-top row--wide' },\n _react2.default.createElement(_ChannelSelect2.default, null)\n ),\n this.props.file.type === 'video/mp4' && _react2.default.createElement(\n 'div',\n { className: 'row row--padded row--no-top row--wide ' },\n _react2.default.createElement(_PublishThumbnailInput2.default, null)\n ),\n _react2.default.createElement(\n 'div',\n { className: 'row row--padded row--no-top row--no-bottom row--wide' },\n _react2.default.createElement(_PublishMetadataInputs2.default, null)\n ),\n _react2.default.createElement(\n 'div',\n { className: 'row row--wide align-content-center' },\n _react2.default.createElement(\n 'button',\n { id: 'publish-submit', className: 'button--primary button--large', onClick: this.onPublishSubmit },\n 'Publish'\n )\n ),\n _react2.default.createElement(\n 'div',\n { className: 'row row--padded row--no-bottom align-content-center' },\n _react2.default.createElement(\n 'button',\n { className: 'button--cancel', onClick: this.props.clearFile },\n 'Cancel'\n )\n ),\n _react2.default.createElement(\n 'div',\n { className: 'row row--short align-content-center' },\n _react2.default.createElement(\n 'p',\n { className: 'fine-print' },\n 'By clicking \\'Publish\\', you affirm that you have the rights to publish this content to the LBRY network, and that you understand the properties of publishing it to a decentralized, user-controlled network. ',\n _react2.default.createElement(\n 'a',\n { className: 'link--primary', target: '_blank', href: 'https://lbry.io/learn' },\n 'Read more.'\n )\n )\n )\n )\n )\n );\n }\n }]);\n\n return PublishDetails;\n}(_react2.default.Component);\n\n;\n\nexports.default = (0, _reactRouterDom.withRouter)(PublishDetails);\n\n/***/ }),\n/* 98 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _reactRedux = __webpack_require__(1);\n\nvar _publish = __webpack_require__(5);\n\nvar _view = __webpack_require__(99);\n\nvar _view2 = _interopRequireDefault(_view);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar mapStateToProps = function mapStateToProps(_ref) {\n var publish = _ref.publish;\n\n return {\n title: publish.metadata.title\n };\n};\n\nvar mapDispatchToProps = function mapDispatchToProps(dispatch) {\n return {\n onMetadataChange: function onMetadataChange(name, value) {\n dispatch((0, _publish.updateMetadata)(name, value));\n }\n };\n};\n\nexports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(_view2.default);\n\n/***/ }),\n/* 99 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar PublishTitleInput = function (_React$Component) {\n _inherits(PublishTitleInput, _React$Component);\n\n function PublishTitleInput(props) {\n _classCallCheck(this, PublishTitleInput);\n\n var _this = _possibleConstructorReturn(this, (PublishTitleInput.__proto__ || Object.getPrototypeOf(PublishTitleInput)).call(this, props));\n\n _this.handleInput = _this.handleInput.bind(_this);\n return _this;\n }\n\n _createClass(PublishTitleInput, [{\n key: 'handleInput',\n value: function handleInput(e) {\n var name = e.target.name;\n var value = e.target.value;\n this.props.onMetadataChange(name, value);\n }\n }, {\n key: 'render',\n value: function render() {\n return _react2.default.createElement('input', { type: 'text', id: 'publish-title', className: 'input-text text--large input-text--full-width', name: 'title', placeholder: 'Give your post a title...', onChange: this.handleInput, value: this.props.title });\n }\n }]);\n\n return PublishTitleInput;\n}(_react2.default.Component);\n\nexports.default = PublishTitleInput;\n\n/***/ }),\n/* 100 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _publish = __webpack_require__(5);\n\nvar _reactRedux = __webpack_require__(1);\n\nvar _view = __webpack_require__(101);\n\nvar _view2 = _interopRequireDefault(_view);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar mapStateToProps = function mapStateToProps(_ref) {\n var channel = _ref.channel,\n publish = _ref.publish;\n\n return {\n loggedInChannelName: channel.loggedInChannel.name,\n loggedInChannelShortId: channel.loggedInChannel.shortId,\n fileName: publish.file.name,\n publishInChannel: publish.publishInChannel,\n selectedChannel: publish.selectedChannel,\n claim: publish.claim,\n urlError: publish.error.url\n };\n};\n\nvar mapDispatchToProps = function mapDispatchToProps(dispatch) {\n return {\n onClaimChange: function onClaimChange(value) {\n dispatch((0, _publish.updateClaim)(value));\n dispatch((0, _publish.updateError)('publishSubmit', null));\n },\n onUrlError: function onUrlError(value) {\n dispatch((0, _publish.updateError)('url', value));\n }\n };\n};\n\nexports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(_view2.default);\n\n/***/ }),\n/* 101 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _request = __webpack_require__(11);\n\nvar _request2 = _interopRequireDefault(_request);\n\nvar _PublishUrlMiddleDisplay = __webpack_require__(102);\n\nvar _PublishUrlMiddleDisplay2 = _interopRequireDefault(_PublishUrlMiddleDisplay);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar PublishUrlInput = function (_React$Component) {\n _inherits(PublishUrlInput, _React$Component);\n\n function PublishUrlInput(props) {\n _classCallCheck(this, PublishUrlInput);\n\n var _this = _possibleConstructorReturn(this, (PublishUrlInput.__proto__ || Object.getPrototypeOf(PublishUrlInput)).call(this, props));\n\n _this.handleInput = _this.handleInput.bind(_this);\n return _this;\n }\n\n _createClass(PublishUrlInput, [{\n key: 'componentDidMount',\n value: function componentDidMount() {\n var _props = this.props,\n claim = _props.claim,\n fileName = _props.fileName;\n\n if (!claim) {\n this.setClaimName(fileName);\n }\n }\n }, {\n key: 'componentWillReceiveProps',\n value: function componentWillReceiveProps(_ref) {\n var claim = _ref.claim,\n fileName = _ref.fileName;\n\n // if a new file was chosen, update the claim name\n if (fileName !== this.props.fileName) {\n return this.setClaimName(fileName);\n }\n // if the claim has updated, check its availability\n if (claim !== this.props.claim) {\n this.validateClaim(claim);\n }\n }\n }, {\n key: 'handleInput',\n value: function handleInput(event) {\n var value = event.target.value;\n value = this.cleanseInput(value);\n // update the state\n this.props.onClaimChange(value);\n }\n }, {\n key: 'cleanseInput',\n value: function cleanseInput(input) {\n input = input.replace(/\\s+/g, '-'); // replace spaces with dashes\n input = input.replace(/[^A-Za-z0-9-]/g, ''); // remove all characters that are not A-Z, a-z, 0-9, or '-'\n return input;\n }\n }, {\n key: 'setClaimName',\n value: function setClaimName(fileName) {\n var fileNameWithoutEnding = fileName.substring(0, fileName.lastIndexOf('.'));\n var cleanClaimName = this.cleanseInput(fileNameWithoutEnding);\n this.props.onClaimChange(cleanClaimName);\n }\n }, {\n key: 'validateClaim',\n value: function validateClaim(claim) {\n var _this2 = this;\n\n if (!claim) {\n return this.props.onUrlError('Enter a url above');\n }\n (0, _request2.default)('/api/claim/availability/' + claim).then(function () {\n _this2.props.onUrlError(null);\n }).catch(function (error) {\n _this2.props.onUrlError(error.message);\n });\n }\n }, {\n key: 'render',\n value: function render() {\n var _props2 = this.props,\n claim = _props2.claim,\n loggedInChannelName = _props2.loggedInChannelName,\n loggedInChannelShortId = _props2.loggedInChannelShortId,\n publishInChannel = _props2.publishInChannel,\n selectedChannel = _props2.selectedChannel,\n urlError = _props2.urlError;\n\n return _react2.default.createElement(\n 'div',\n { className: 'column column--10 column--sml-10' },\n _react2.default.createElement(\n 'div',\n { className: 'input-text--primary span--relative' },\n _react2.default.createElement(\n 'span',\n { className: 'url-text--secondary' },\n 'spee.ch / '\n ),\n _react2.default.createElement(_PublishUrlMiddleDisplay2.default, {\n publishInChannel: publishInChannel,\n selectedChannel: selectedChannel,\n loggedInChannelName: loggedInChannelName,\n loggedInChannelShortId: loggedInChannelShortId\n }),\n _react2.default.createElement('input', { type: 'text', id: 'claim-name-input', className: 'input-text', name: 'claim', placeholder: 'your-url-here', onChange: this.handleInput, value: claim }),\n claim && !urlError && _react2.default.createElement(\n 'span',\n { id: 'input-success-claim-name', className: 'info-message--success span--absolute' },\n '\\u2713'\n ),\n urlError && _react2.default.createElement(\n 'span',\n { id: 'input-success-channel-name', className: 'info-message--failure span--absolute' },\n '\\u2716'\n )\n ),\n _react2.default.createElement(\n 'div',\n null,\n urlError ? _react2.default.createElement(\n 'p',\n { id: 'input-error-claim-name', className: 'info-message--failure' },\n urlError\n ) : _react2.default.createElement(\n 'p',\n { className: 'info-message' },\n 'Choose a custom url'\n )\n )\n );\n }\n }]);\n\n return PublishUrlInput;\n}(_react2.default.Component);\n\nexports.default = PublishUrlInput;\n\n/***/ }),\n/* 102 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(10);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction UrlMiddle(_ref) {\n var publishInChannel = _ref.publishInChannel,\n selectedChannel = _ref.selectedChannel,\n loggedInChannelName = _ref.loggedInChannelName,\n loggedInChannelShortId = _ref.loggedInChannelShortId;\n\n if (publishInChannel) {\n if (selectedChannel === loggedInChannelName) {\n return _react2.default.createElement(\n 'span',\n { id: 'url-channel', className: 'url-text--secondary' },\n loggedInChannelName,\n ':',\n loggedInChannelShortId,\n ' /'\n );\n }\n return _react2.default.createElement(\n 'span',\n { id: 'url-channel-placeholder', className: 'url-text--secondary tooltip' },\n '@channel',\n _react2.default.createElement(\n 'span',\n {\n className: 'tooltip-text' },\n 'Select a channel below'\n ),\n ' /'\n );\n }\n return _react2.default.createElement(\n 'span',\n { id: 'url-no-channel-placeholder', className: 'url-text--secondary tooltip' },\n 'xyz',\n _react2.default.createElement(\n 'span',\n { className: 'tooltip-text' },\n 'This will be a random id'\n ),\n ' /'\n );\n}\n\nUrlMiddle.propTypes = {\n publishInChannel: _propTypes2.default.bool.isRequired,\n loggedInChannelName: _propTypes2.default.string,\n loggedInChannelShortId: _propTypes2.default.string\n};\n\nexports.default = UrlMiddle;\n\n/***/ }),\n/* 103 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _reactRedux = __webpack_require__(1);\n\nvar _publish = __webpack_require__(5);\n\nvar _view = __webpack_require__(104);\n\nvar _view2 = _interopRequireDefault(_view);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar mapStateToProps = function mapStateToProps(_ref) {\n var file = _ref.publish.file;\n\n return {\n file: file\n };\n};\n\nvar mapDispatchToProps = {\n onNewThumbnail: _publish.onNewThumbnail\n};\n\nexports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(_view2.default);\n\n/***/ }),\n/* 104 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nfunction dataURItoBlob(dataURI) {\n // convert base64/URLEncoded data component to raw binary data held in a string\n var byteString = atob(dataURI.split(',')[1]);\n // separate out the mime component\n var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0];\n // write the bytes of the string to a typed array\n var ia = new Uint8Array(byteString.length);\n for (var i = 0; i < byteString.length; i++) {\n ia[i] = byteString.charCodeAt(i);\n }\n return new Blob([ia], { type: mimeString });\n}\n\nvar PublishThumbnailInput = function (_React$Component) {\n _inherits(PublishThumbnailInput, _React$Component);\n\n function PublishThumbnailInput(props) {\n _classCallCheck(this, PublishThumbnailInput);\n\n var _this = _possibleConstructorReturn(this, (PublishThumbnailInput.__proto__ || Object.getPrototypeOf(PublishThumbnailInput)).call(this, props));\n\n _this.state = {\n videoSource: null,\n error: null,\n sliderMinRange: 1,\n sliderMaxRange: null,\n sliderValue: null\n };\n _this.handleVideoLoadedData = _this.handleVideoLoadedData.bind(_this);\n _this.handleSliderChange = _this.handleSliderChange.bind(_this);\n _this.createThumbnail = _this.createThumbnail.bind(_this);\n return _this;\n }\n\n _createClass(PublishThumbnailInput, [{\n key: 'componentDidMount',\n value: function componentDidMount() {\n var file = this.props.file;\n\n this.setVideoSource(file);\n }\n }, {\n key: 'componentWillReceiveProps',\n value: function componentWillReceiveProps(nextProps) {\n // if file changes\n if (nextProps.file && nextProps.file !== this.props.file) {\n var file = nextProps.file;\n\n this.setVideoSource(file);\n };\n }\n }, {\n key: 'setVideoSource',\n value: function setVideoSource(file) {\n var _this2 = this;\n\n var previewReader = new FileReader();\n previewReader.readAsDataURL(file);\n previewReader.onloadend = function () {\n var dataUri = previewReader.result;\n var blob = dataURItoBlob(dataUri);\n var videoSource = URL.createObjectURL(blob);\n _this2.setState({ videoSource: videoSource });\n };\n }\n }, {\n key: 'handleVideoLoadedData',\n value: function handleVideoLoadedData(event) {\n var duration = event.target.duration;\n var totalMinutes = Math.floor(duration / 60);\n var totalSeconds = Math.floor(duration % 60);\n // set the slider\n this.setState({\n sliderMaxRange: duration * 100,\n sliderValue: duration * 100 / 2,\n totalMinutes: totalMinutes,\n totalSeconds: totalSeconds\n });\n // update the current time of the video\n var video = document.getElementById('video-thumb-player');\n video.currentTime = duration / 2;\n }\n }, {\n key: 'handleSliderChange',\n value: function handleSliderChange(event) {\n var value = parseInt(event.target.value);\n // update the slider value\n this.setState({\n sliderValue: value\n });\n // update the current time of the video\n var video = document.getElementById('video-thumb-player');\n video.currentTime = value / 100;\n }\n }, {\n key: 'createThumbnail',\n value: function createThumbnail() {\n // take a snapshot\n var video = document.getElementById('video-thumb-player');\n var canvas = document.createElement('canvas');\n canvas.width = video.videoWidth;\n canvas.height = video.videoHeight;\n canvas.getContext('2d').drawImage(video, 0, 0, canvas.width, canvas.height);\n var dataUrl = canvas.toDataURL();\n var blob = dataURItoBlob(dataUrl);\n var snapshot = new File([blob], 'thumbnail.png', {\n type: 'image/png'\n });\n // set the thumbnail in redux store\n if (snapshot) {\n this.props.onNewThumbnail(snapshot);\n }\n }\n }, {\n key: 'render',\n value: function render() {\n var _state = this.state,\n error = _state.error,\n videoSource = _state.videoSource,\n sliderMinRange = _state.sliderMinRange,\n sliderMaxRange = _state.sliderMaxRange,\n sliderValue = _state.sliderValue,\n totalMinutes = _state.totalMinutes,\n totalSeconds = _state.totalSeconds;\n\n return _react2.default.createElement(\n 'div',\n null,\n _react2.default.createElement(\n 'label',\n { className: 'label' },\n 'Thumbnail:'\n ),\n _react2.default.createElement('video', {\n id: 'video-thumb-player',\n preload: 'metadata',\n muted: true,\n style: { display: 'none' },\n playsInline: true,\n onLoadedData: this.handleVideoLoadedData,\n src: videoSource,\n onSeeked: this.createThumbnail\n }),\n sliderValue ? _react2.default.createElement(\n 'div',\n null,\n _react2.default.createElement(\n 'div',\n { className: 'flex-container--row flex-container--space-between-center', style: { width: '100%' } },\n _react2.default.createElement(\n 'span',\n { className: 'info-message' },\n '0\\'00\"'\n ),\n _react2.default.createElement(\n 'span',\n { className: 'info-message' },\n totalMinutes,\n '\\'',\n totalSeconds,\n '\"'\n )\n ),\n _react2.default.createElement(\n 'div',\n null,\n _react2.default.createElement('input', {\n type: 'range',\n min: sliderMinRange,\n max: sliderMaxRange,\n value: sliderValue,\n className: 'slider',\n onChange: this.handleSliderChange\n })\n )\n ) : _react2.default.createElement(\n 'p',\n { className: 'info-message' },\n 'loading... '\n ),\n error ? _react2.default.createElement(\n 'p',\n { className: 'info-message--failure' },\n error\n ) : _react2.default.createElement(\n 'p',\n { className: 'info-message' },\n 'Use slider to set thumbnail'\n )\n );\n }\n }]);\n\n return PublishThumbnailInput;\n}(_react2.default.Component);\n\nexports.default = PublishThumbnailInput;\n\n/***/ }),\n/* 105 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _reactRedux = __webpack_require__(1);\n\nvar _publish = __webpack_require__(5);\n\nvar _view = __webpack_require__(106);\n\nvar _view2 = _interopRequireDefault(_view);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar mapStateToProps = function mapStateToProps(_ref) {\n var publish = _ref.publish;\n\n return {\n showMetadataInputs: publish.showMetadataInputs,\n description: publish.metadata.description,\n license: publish.metadata.license,\n nsfw: publish.metadata.nsfw\n };\n};\n\nvar mapDispatchToProps = function mapDispatchToProps(dispatch) {\n return {\n onMetadataChange: function onMetadataChange(name, value) {\n dispatch((0, _publish.updateMetadata)(name, value));\n },\n onToggleMetadataInputs: function onToggleMetadataInputs(value) {\n dispatch((0, _publish.toggleMetadataInputs)(value));\n }\n };\n};\n\nexports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(_view2.default);\n\n/***/ }),\n/* 106 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _ExpandingTextArea = __webpack_require__(107);\n\nvar _ExpandingTextArea2 = _interopRequireDefault(_ExpandingTextArea);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar PublishMetadataInputs = function (_React$Component) {\n _inherits(PublishMetadataInputs, _React$Component);\n\n function PublishMetadataInputs(props) {\n _classCallCheck(this, PublishMetadataInputs);\n\n var _this = _possibleConstructorReturn(this, (PublishMetadataInputs.__proto__ || Object.getPrototypeOf(PublishMetadataInputs)).call(this, props));\n\n _this.toggleShowInputs = _this.toggleShowInputs.bind(_this);\n _this.handleInput = _this.handleInput.bind(_this);\n _this.handleSelect = _this.handleSelect.bind(_this);\n return _this;\n }\n\n _createClass(PublishMetadataInputs, [{\n key: 'toggleShowInputs',\n value: function toggleShowInputs() {\n this.props.onToggleMetadataInputs(!this.props.showMetadataInputs);\n }\n }, {\n key: 'handleInput',\n value: function handleInput(event) {\n var target = event.target;\n var value = target.type === 'checkbox' ? target.checked : target.value;\n var name = target.name;\n this.props.onMetadataChange(name, value);\n }\n }, {\n key: 'handleSelect',\n value: function handleSelect(event) {\n var name = event.target.name;\n var selectedOption = event.target.selectedOptions[0].value;\n this.props.onMetadataChange(name, selectedOption);\n }\n }, {\n key: 'render',\n value: function render() {\n return _react2.default.createElement(\n 'div',\n { id: 'publish-details', className: 'row row--padded row--no-top row--wide' },\n this.props.showMetadataInputs && _react2.default.createElement(\n 'div',\n null,\n _react2.default.createElement(\n 'div',\n { className: 'row row--no-top' },\n _react2.default.createElement(\n 'div',\n { className: 'column column--3 column--med-10 align-content-top' },\n _react2.default.createElement(\n 'label',\n { htmlFor: 'publish-license', className: 'label' },\n 'Description:'\n )\n ),\n _react2.default.createElement(\n 'div',\n { className: 'column column--7 column--sml-10' },\n _react2.default.createElement(_ExpandingTextArea2.default, {\n id: 'publish-description',\n className: 'textarea textarea--primary textarea--full-width',\n rows: 1,\n maxLength: 2000,\n style: { maxHeight: 200 },\n name: 'description',\n placeholder: 'Optional description',\n value: this.props.description,\n onChange: this.handleInput })\n )\n ),\n _react2.default.createElement(\n 'div',\n { className: 'row row--no-top' },\n _react2.default.createElement(\n 'div',\n { className: 'column column--3 column--med-10' },\n _react2.default.createElement(\n 'label',\n { htmlFor: 'publish-license', className: 'label' },\n 'License:'\n )\n ),\n _react2.default.createElement(\n 'div',\n { className: 'column column--7 column--sml-10' },\n _react2.default.createElement(\n 'select',\n { type: 'text', name: 'license', id: 'publish-license', className: 'select select--primary', onChange: this.handleSelect },\n _react2.default.createElement(\n 'option',\n { value: ' ' },\n 'Unspecified'\n ),\n _react2.default.createElement(\n 'option',\n { value: 'Public Domain' },\n 'Public Domain'\n ),\n _react2.default.createElement(\n 'option',\n { value: 'Creative Commons' },\n 'Creative Commons'\n )\n )\n )\n ),\n _react2.default.createElement(\n 'div',\n { className: 'row row--no-top' },\n _react2.default.createElement(\n 'div',\n { className: 'column column--3' },\n _react2.default.createElement(\n 'label',\n { htmlFor: 'publish-nsfw', className: 'label' },\n 'Mature:'\n )\n ),\n _react2.default.createElement(\n 'div',\n { className: 'column column--7' },\n _react2.default.createElement('input', { className: 'input-checkbox', type: 'checkbox', id: 'publish-nsfw', name: 'nsfw', value: this.props.nsfw, onChange: this.handleInput })\n )\n )\n ),\n _react2.default.createElement(\n 'button',\n { className: 'button--secondary', onClick: this.toggleShowInputs },\n this.props.showMetadataInputs ? 'less' : 'more'\n )\n );\n }\n }]);\n\n return PublishMetadataInputs;\n}(_react2.default.Component);\n\nexports.default = PublishMetadataInputs;\n\n/***/ }),\n/* 107 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(10);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar ExpandingTextarea = function (_Component) {\n _inherits(ExpandingTextarea, _Component);\n\n function ExpandingTextarea(props) {\n _classCallCheck(this, ExpandingTextarea);\n\n var _this = _possibleConstructorReturn(this, (ExpandingTextarea.__proto__ || Object.getPrototypeOf(ExpandingTextarea)).call(this, props));\n\n _this._handleChange = _this._handleChange.bind(_this);\n return _this;\n }\n\n _createClass(ExpandingTextarea, [{\n key: 'componentDidMount',\n value: function componentDidMount() {\n this.adjustTextarea({});\n }\n }, {\n key: '_handleChange',\n value: function _handleChange(event) {\n var onChange = this.props.onChange;\n\n if (onChange) onChange(event);\n this.adjustTextarea(event);\n }\n }, {\n key: 'adjustTextarea',\n value: function adjustTextarea(_ref) {\n var _ref$target = _ref.target,\n target = _ref$target === undefined ? this.el : _ref$target;\n\n target.style.height = 0;\n target.style.height = target.scrollHeight + 'px';\n }\n }, {\n key: 'render',\n value: function render() {\n var _this2 = this;\n\n var rest = _objectWithoutProperties(this.props, []);\n\n return _react2.default.createElement('textarea', _extends({}, rest, {\n ref: function ref(x) {\n return _this2.el = x;\n },\n onChange: this._handleChange\n }));\n }\n }]);\n\n return ExpandingTextarea;\n}(_react.Component);\n\nExpandingTextarea.propTypes = {\n onChange: _propTypes2.default.func\n};\n\nexports.default = ExpandingTextarea;\n\n/***/ }),\n/* 108 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _reactRedux = __webpack_require__(1);\n\nvar _publish = __webpack_require__(5);\n\nvar _view = __webpack_require__(109);\n\nvar _view2 = _interopRequireDefault(_view);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar mapStateToProps = function mapStateToProps(_ref) {\n var channel = _ref.channel,\n publish = _ref.publish;\n\n return {\n loggedInChannelName: channel.loggedInChannel.name,\n publishInChannel: publish.publishInChannel,\n selectedChannel: publish.selectedChannel,\n channelError: publish.error.channel\n };\n};\n\nvar mapDispatchToProps = function mapDispatchToProps(dispatch) {\n return {\n onPublishInChannelChange: function onPublishInChannelChange(value) {\n dispatch((0, _publish.updateError)('channel', null));\n dispatch((0, _publish.setPublishInChannel)(value));\n },\n onChannelSelect: function onChannelSelect(value) {\n dispatch((0, _publish.updateError)('channel', null));\n dispatch((0, _publish.updateSelectedChannel)(value));\n }\n };\n};\n\nexports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(_view2.default);\n\n/***/ }),\n/* 109 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _ChannelLoginForm = __webpack_require__(38);\n\nvar _ChannelLoginForm2 = _interopRequireDefault(_ChannelLoginForm);\n\nvar _ChannelCreateForm = __webpack_require__(39);\n\nvar _ChannelCreateForm2 = _interopRequireDefault(_ChannelCreateForm);\n\nvar _publish_channel_select_states = __webpack_require__(32);\n\nvar states = _interopRequireWildcard(_publish_channel_select_states);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar ChannelSelect = function (_React$Component) {\n _inherits(ChannelSelect, _React$Component);\n\n function ChannelSelect(props) {\n _classCallCheck(this, ChannelSelect);\n\n var _this = _possibleConstructorReturn(this, (ChannelSelect.__proto__ || Object.getPrototypeOf(ChannelSelect)).call(this, props));\n\n _this.toggleAnonymousPublish = _this.toggleAnonymousPublish.bind(_this);\n _this.handleSelection = _this.handleSelection.bind(_this);\n return _this;\n }\n\n _createClass(ChannelSelect, [{\n key: 'toggleAnonymousPublish',\n value: function toggleAnonymousPublish(event) {\n var value = event.target.value;\n if (value === 'anonymous') {\n this.props.onPublishInChannelChange(false);\n } else {\n this.props.onPublishInChannelChange(true);\n }\n }\n }, {\n key: 'handleSelection',\n value: function handleSelection(event) {\n var selectedOption = event.target.selectedOptions[0].value;\n this.props.onChannelSelect(selectedOption);\n }\n }, {\n key: 'render',\n value: function render() {\n return _react2.default.createElement(\n 'div',\n null,\n _react2.default.createElement(\n 'form',\n null,\n _react2.default.createElement(\n 'div',\n { className: 'column column--3 column--med-10' },\n _react2.default.createElement('input', { type: 'radio', name: 'anonymous-or-channel', id: 'anonymous-radio', className: 'input-radio', value: 'anonymous', checked: !this.props.publishInChannel, onChange: this.toggleAnonymousPublish }),\n _react2.default.createElement(\n 'label',\n { className: 'label label--pointer', htmlFor: 'anonymous-radio' },\n 'Anonymous'\n )\n ),\n _react2.default.createElement(\n 'div',\n { className: 'column column--7 column--med-10' },\n _react2.default.createElement('input', { type: 'radio', name: 'anonymous-or-channel', id: 'channel-radio', className: 'input-radio', value: 'in a channel', checked: this.props.publishInChannel, onChange: this.toggleAnonymousPublish }),\n _react2.default.createElement(\n 'label',\n { className: 'label label--pointer', htmlFor: 'channel-radio' },\n 'In a channel'\n )\n ),\n this.props.channelError ? _react2.default.createElement(\n 'p',\n { className: 'info-message--failure' },\n this.props.channelError\n ) : _react2.default.createElement(\n 'p',\n { className: 'info-message' },\n 'Publish anonymously or in a channel'\n )\n ),\n this.props.publishInChannel && _react2.default.createElement(\n 'div',\n null,\n _react2.default.createElement(\n 'div',\n { className: 'column column--3' },\n _react2.default.createElement(\n 'label',\n { className: 'label', htmlFor: 'channel-name-select' },\n 'Channel:'\n )\n ),\n _react2.default.createElement(\n 'div',\n { className: 'column column--7' },\n _react2.default.createElement(\n 'select',\n { type: 'text', id: 'channel-name-select', className: 'select select--arrow', value: this.props.selectedChannel, onChange: this.handleSelection },\n this.props.loggedInChannelName && _react2.default.createElement(\n 'option',\n { value: this.props.loggedInChannelName, id: 'publish-channel-select-channel-option' },\n this.props.loggedInChannelName\n ),\n _react2.default.createElement(\n 'option',\n { value: states.LOGIN },\n 'Existing'\n ),\n _react2.default.createElement(\n 'option',\n { value: states.CREATE },\n 'New'\n )\n )\n ),\n this.props.selectedChannel === states.LOGIN && _react2.default.createElement(_ChannelLoginForm2.default, null),\n this.props.selectedChannel === states.CREATE && _react2.default.createElement(_ChannelCreateForm2.default, null)\n )\n );\n }\n }]);\n\n return ChannelSelect;\n}(_react2.default.Component);\n\nexports.default = ChannelSelect;\n\n/***/ }),\n/* 110 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _request = __webpack_require__(11);\n\nvar _request2 = _interopRequireDefault(_request);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar ChannelLoginForm = function (_React$Component) {\n _inherits(ChannelLoginForm, _React$Component);\n\n function ChannelLoginForm(props) {\n _classCallCheck(this, ChannelLoginForm);\n\n var _this = _possibleConstructorReturn(this, (ChannelLoginForm.__proto__ || Object.getPrototypeOf(ChannelLoginForm)).call(this, props));\n\n _this.state = {\n error: null,\n name: '',\n password: ''\n };\n _this.handleInput = _this.handleInput.bind(_this);\n _this.loginToChannel = _this.loginToChannel.bind(_this);\n return _this;\n }\n\n _createClass(ChannelLoginForm, [{\n key: 'handleInput',\n value: function handleInput(event) {\n var name = event.target.name;\n var value = event.target.value;\n this.setState(_defineProperty({}, name, value));\n }\n }, {\n key: 'loginToChannel',\n value: function loginToChannel(event) {\n var _this2 = this;\n\n event.preventDefault();\n var params = {\n method: 'POST',\n body: JSON.stringify({ username: this.state.name, password: this.state.password }),\n headers: new Headers({\n 'Content-Type': 'application/json'\n }),\n credentials: 'include'\n };\n (0, _request2.default)('login', params).then(function (_ref) {\n var success = _ref.success,\n channelName = _ref.channelName,\n shortChannelId = _ref.shortChannelId,\n channelClaimId = _ref.channelClaimId,\n message = _ref.message;\n\n if (success) {\n _this2.props.onChannelLogin(channelName, shortChannelId, channelClaimId);\n } else {\n _this2.setState({ 'error': message });\n };\n }).catch(function (error) {\n if (error.message) {\n _this2.setState({ 'error': error.message });\n } else {\n _this2.setState({ 'error': error });\n }\n });\n }\n }, {\n key: 'render',\n value: function render() {\n return _react2.default.createElement(\n 'form',\n { id: 'channel-login-form' },\n _react2.default.createElement(\n 'div',\n { className: 'row row--wide row--short' },\n _react2.default.createElement(\n 'div',\n { className: 'column column--3 column--sml-10' },\n _react2.default.createElement(\n 'label',\n { className: 'label', htmlFor: 'channel-login-name-input' },\n 'Name:'\n )\n ),\n _react2.default.createElement(\n 'div',\n { className: 'column column--6 column--sml-10' },\n _react2.default.createElement(\n 'div',\n { className: 'input-text--primary flex-container--row flex-container--left-bottom' },\n _react2.default.createElement(\n 'span',\n null,\n '@'\n ),\n _react2.default.createElement('input', { type: 'text', id: 'channel-login-name-input', className: 'input-text', name: 'name', placeholder: 'Your Channel Name', value: this.state.channelName, onChange: this.handleInput })\n )\n )\n ),\n _react2.default.createElement(\n 'div',\n { className: 'row row--wide row--short' },\n _react2.default.createElement(\n 'div',\n { className: 'column column--3 column--sml-10' },\n _react2.default.createElement(\n 'label',\n { className: 'label', htmlFor: 'channel-login-password-input' },\n 'Password:'\n )\n ),\n _react2.default.createElement(\n 'div',\n { className: 'column column--6 column--sml-10' },\n _react2.default.createElement(\n 'div',\n { className: 'input-text--primary' },\n _react2.default.createElement('input', { type: 'password', id: 'channel-login-password-input', name: 'password', className: 'input-text', placeholder: '', value: this.state.channelPassword, onChange: this.handleInput })\n )\n )\n ),\n this.state.error ? _react2.default.createElement(\n 'p',\n { className: 'info-message--failure' },\n this.state.error\n ) : _react2.default.createElement(\n 'p',\n { className: 'info-message' },\n 'Enter the name and password for your channel'\n ),\n _react2.default.createElement(\n 'div',\n { className: 'row row--wide' },\n _react2.default.createElement(\n 'button',\n { className: 'button--primary', onClick: this.loginToChannel },\n 'Authenticate'\n )\n )\n );\n }\n }]);\n\n return ChannelLoginForm;\n}(_react2.default.Component);\n\nexports.default = ChannelLoginForm;\n\n/***/ }),\n/* 111 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _ProgressBar = __webpack_require__(20);\n\nvar _ProgressBar2 = _interopRequireDefault(_ProgressBar);\n\nvar _request = __webpack_require__(11);\n\nvar _request2 = _interopRequireDefault(_request);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar ChannelCreateForm = function (_React$Component) {\n _inherits(ChannelCreateForm, _React$Component);\n\n function ChannelCreateForm(props) {\n _classCallCheck(this, ChannelCreateForm);\n\n var _this = _possibleConstructorReturn(this, (ChannelCreateForm.__proto__ || Object.getPrototypeOf(ChannelCreateForm)).call(this, props));\n\n _this.state = {\n error: null,\n channel: '',\n password: '',\n status: null\n };\n _this.handleChannelInput = _this.handleChannelInput.bind(_this);\n _this.handleInput = _this.handleInput.bind(_this);\n _this.createChannel = _this.createChannel.bind(_this);\n return _this;\n }\n\n _createClass(ChannelCreateForm, [{\n key: 'cleanseChannelInput',\n value: function cleanseChannelInput(input) {\n input = input.replace(/\\s+/g, '-'); // replace spaces with dashes\n input = input.replace(/[^A-Za-z0-9-]/g, ''); // remove all characters that are not A-Z, a-z, 0-9, or '-'\n return input;\n }\n }, {\n key: 'handleChannelInput',\n value: function handleChannelInput(event) {\n var value = event.target.value;\n value = this.cleanseChannelInput(value);\n this.setState({ channel: value });\n if (value) {\n this.updateIsChannelAvailable(value);\n } else {\n this.setState({ error: 'Please enter a channel name' });\n }\n }\n }, {\n key: 'handleInput',\n value: function handleInput(event) {\n var name = event.target.name;\n var value = event.target.value;\n this.setState(_defineProperty({}, name, value));\n }\n }, {\n key: 'updateIsChannelAvailable',\n value: function updateIsChannelAvailable(channel) {\n var _this2 = this;\n\n var channelWithAtSymbol = '@' + channel;\n (0, _request2.default)('/api/channel/availability/' + channelWithAtSymbol).then(function (isAvailable) {\n if (isAvailable) {\n _this2.setState({ 'error': null });\n } else {\n _this2.setState({ 'error': 'That channel has already been claimed' });\n }\n }).catch(function (error) {\n _this2.setState({ 'error': error.message });\n });\n }\n }, {\n key: 'checkIsChannelAvailable',\n value: function checkIsChannelAvailable(channel) {\n var channelWithAtSymbol = '@' + channel;\n return new Promise(function (resolve, reject) {\n (0, _request2.default)('/api/channel/availability/' + channelWithAtSymbol).then(function (isAvailable) {\n if (!isAvailable) {\n return reject(new Error('That channel has already been claimed'));\n }\n resolve();\n }).catch(function (error) {\n reject(error);\n });\n });\n }\n }, {\n key: 'checkIsPasswordProvided',\n value: function checkIsPasswordProvided() {\n var password = this.state.password;\n return new Promise(function (resolve, reject) {\n if (!password || password.length < 1) {\n return reject(new Error('Please provide a password'));\n }\n resolve();\n });\n }\n }, {\n key: 'makePublishChannelRequest',\n value: function makePublishChannelRequest(username, password) {\n var params = {\n method: 'POST',\n body: JSON.stringify({ username: username, password: password }),\n headers: new Headers({\n 'Content-Type': 'application/json'\n }),\n credentials: 'include'\n };\n return new Promise(function (resolve, reject) {\n (0, _request2.default)('/signup', params).then(function (result) {\n return resolve(result);\n }).catch(function (error) {\n reject(new Error('Unfortunately, we encountered an error while creating your channel. Please let us know in Discord! ' + error.message));\n });\n });\n }\n }, {\n key: 'createChannel',\n value: function createChannel(event) {\n var _this3 = this;\n\n event.preventDefault();\n this.checkIsPasswordProvided().then(function () {\n return _this3.checkIsChannelAvailable(_this3.state.channel, _this3.state.password);\n }).then(function () {\n _this3.setState({ status: 'We are publishing your new channel. Sit tight...' });\n return _this3.makePublishChannelRequest(_this3.state.channel, _this3.state.password);\n }).then(function (result) {\n _this3.setState({ status: null });\n _this3.props.onChannelLogin(result.channelName, result.shortChannelId, result.channelClaimId);\n }).catch(function (error) {\n _this3.setState({ 'error': error.message, status: null });\n });\n }\n }, {\n key: 'render',\n value: function render() {\n return _react2.default.createElement(\n 'div',\n null,\n !this.state.status ? _react2.default.createElement(\n 'form',\n { id: 'publish-channel-form' },\n _react2.default.createElement(\n 'div',\n { className: 'row row--wide row--short' },\n _react2.default.createElement(\n 'div',\n { className: 'column column--3 column--sml-10' },\n _react2.default.createElement(\n 'label',\n { className: 'label', htmlFor: 'new-channel-name' },\n 'Name:'\n )\n ),\n _react2.default.createElement(\n 'div',\n { className: 'column column--6 column--sml-10' },\n _react2.default.createElement(\n 'div',\n { className: 'input-text--primary flex-container--row flex-container--left-bottom span--relative' },\n _react2.default.createElement(\n 'span',\n null,\n '@'\n ),\n _react2.default.createElement('input', { type: 'text', name: 'channel', id: 'new-channel-name', className: 'input-text', placeholder: 'exampleChannelName', value: this.state.channel, onChange: this.handleChannelInput }),\n this.state.channel && !this.state.error && _react2.default.createElement(\n 'span',\n { id: 'input-success-channel-name', className: 'info-message--success span--absolute' },\n '\\u2713'\n ),\n this.state.error && _react2.default.createElement(\n 'span',\n { id: 'input-success-channel-name', className: 'info-message--failure span--absolute' },\n '\\u2716'\n )\n )\n )\n ),\n _react2.default.createElement(\n 'div',\n { className: 'row row--wide row--short' },\n _react2.default.createElement(\n 'div',\n { className: 'column column--3 column--sml-10' },\n _react2.default.createElement(\n 'label',\n { className: 'label', htmlFor: 'new-channel-password' },\n 'Password:'\n )\n ),\n _react2.default.createElement(\n 'div',\n { className: 'column column--6 column--sml-10' },\n _react2.default.createElement(\n 'div',\n { className: 'input-text--primary' },\n _react2.default.createElement('input', { type: 'password', name: 'password', id: 'new-channel-password', className: 'input-text', placeholder: '', value: this.state.password, onChange: this.handleInput })\n )\n )\n ),\n this.state.error ? _react2.default.createElement(\n 'p',\n { className: 'info-message--failure' },\n this.state.error\n ) : _react2.default.createElement(\n 'p',\n { className: 'info-message' },\n 'Choose a name and password for your channel'\n ),\n _react2.default.createElement(\n 'div',\n { className: 'row row--wide' },\n _react2.default.createElement(\n 'button',\n { className: 'button--primary', onClick: this.createChannel },\n 'Create Channel'\n )\n )\n ) : _react2.default.createElement(\n 'div',\n null,\n _react2.default.createElement(\n 'p',\n { className: 'fine-print' },\n this.state.status\n ),\n _react2.default.createElement(_ProgressBar2.default, { size: 12 })\n )\n );\n }\n }]);\n\n return ChannelCreateForm;\n}(_react2.default.Component);\n\nexports.default = ChannelCreateForm;\n\n/***/ }),\n/* 112 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar ActiveStatusBar = function ActiveStatusBar() {\n return _react2.default.createElement(\n 'span',\n { className: 'progress-bar progress-bar--active' },\n '| '\n );\n};\n\nexports.default = ActiveStatusBar;\n\n/***/ }),\n/* 113 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar InactiveStatusBar = function InactiveStatusBar() {\n return _react2.default.createElement(\n 'span',\n { className: 'progress-bar progress-bar--inactive' },\n '| '\n );\n};\n\nexports.default = InactiveStatusBar;\n\n/***/ }),\n/* 114 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _reactRedux = __webpack_require__(1);\n\nvar _publish = __webpack_require__(5);\n\nvar _view = __webpack_require__(115);\n\nvar _view2 = _interopRequireDefault(_view);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar mapStateToProps = function mapStateToProps(_ref) {\n var publish = _ref.publish;\n\n return {\n status: publish.status.status,\n message: publish.status.message\n };\n};\n\nvar mapDispatchToProps = {\n clearFile: _publish.clearFile\n};\n\nexports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(_view2.default);\n\n/***/ }),\n/* 115 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _ProgressBar = __webpack_require__(20);\n\nvar _ProgressBar2 = _interopRequireDefault(_ProgressBar);\n\nvar _publish_claim_states = __webpack_require__(116);\n\nvar publishStates = _interopRequireWildcard(_publish_claim_states);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar PublishStatus = function (_React$Component) {\n _inherits(PublishStatus, _React$Component);\n\n function PublishStatus() {\n _classCallCheck(this, PublishStatus);\n\n return _possibleConstructorReturn(this, (PublishStatus.__proto__ || Object.getPrototypeOf(PublishStatus)).apply(this, arguments));\n }\n\n _createClass(PublishStatus, [{\n key: 'render',\n value: function render() {\n var _props = this.props,\n status = _props.status,\n message = _props.message,\n clearFile = _props.clearFile;\n\n return _react2.default.createElement(\n 'div',\n { className: 'row row--tall flex-container--column flex-container--center-center' },\n status === publishStates.LOAD_START && _react2.default.createElement(\n 'div',\n { className: 'row align-content-center' },\n _react2.default.createElement(\n 'p',\n null,\n 'File is loading to server'\n ),\n _react2.default.createElement(\n 'p',\n { className: 'blue' },\n '0%'\n )\n ),\n status === publishStates.LOADING && _react2.default.createElement(\n 'div',\n null,\n _react2.default.createElement(\n 'div',\n { className: 'row align-content-center' },\n _react2.default.createElement(\n 'p',\n null,\n 'File is loading to server'\n ),\n _react2.default.createElement(\n 'p',\n { className: 'blue' },\n message\n )\n )\n ),\n status === publishStates.PUBLISHING && _react2.default.createElement(\n 'div',\n { className: 'row align-content-center' },\n _react2.default.createElement(\n 'p',\n null,\n 'Upload complete. Your file is now being published on the blockchain...'\n ),\n _react2.default.createElement(_ProgressBar2.default, { size: 12 }),\n _react2.default.createElement(\n 'p',\n null,\n 'Curious what magic is happening here? ',\n _react2.default.createElement(\n 'a',\n { className: 'link--primary', target: 'blank', href: 'https://lbry.io/faq/what-is-lbry' },\n 'Learn more.'\n )\n )\n ),\n status === publishStates.SUCCESS && _react2.default.createElement(\n 'div',\n { className: 'row align-content-center' },\n _react2.default.createElement(\n 'p',\n null,\n 'Your publish is complete! You are being redirected to it now.'\n ),\n _react2.default.createElement(\n 'p',\n null,\n 'If you are not automatically redirected, ',\n _react2.default.createElement(\n 'a',\n { className: 'link--primary', target: '_blank', href: message },\n 'click here.'\n )\n )\n ),\n status === publishStates.FAILED && _react2.default.createElement(\n 'div',\n { className: 'row align-content-center' },\n _react2.default.createElement(\n 'p',\n null,\n 'Something went wrong...'\n ),\n _react2.default.createElement(\n 'p',\n null,\n _react2.default.createElement(\n 'strong',\n null,\n message\n )\n ),\n _react2.default.createElement(\n 'p',\n null,\n 'For help, post the above error text in the #speech channel on the ',\n _react2.default.createElement(\n 'a',\n { className: 'link--primary', href: 'https://discord.gg/YjYbwhS', target: '_blank' },\n 'lbry discord'\n )\n ),\n _react2.default.createElement(\n 'button',\n { className: 'button--secondary', onClick: clearFile },\n 'Reset'\n )\n )\n );\n }\n }]);\n\n return PublishStatus;\n}(_react2.default.Component);\n\n;\n\nexports.default = PublishStatus;\n\n/***/ }),\n/* 116 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nvar LOAD_START = exports.LOAD_START = 'LOAD_START';\nvar LOADING = exports.LOADING = 'LOADING';\nvar PUBLISHING = exports.PUBLISHING = 'PUBLISHING';\nvar SUCCESS = exports.SUCCESS = 'SUCCESS';\nvar FAILED = exports.FAILED = 'FAILED';\n\n/***/ }),\n/* 117 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _NavBar = __webpack_require__(7);\n\nvar _NavBar2 = _interopRequireDefault(_NavBar);\n\nvar _SEO = __webpack_require__(9);\n\nvar _SEO2 = _interopRequireDefault(_SEO);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar AboutPage = function (_React$Component) {\n _inherits(AboutPage, _React$Component);\n\n function AboutPage() {\n _classCallCheck(this, AboutPage);\n\n return _possibleConstructorReturn(this, (AboutPage.__proto__ || Object.getPrototypeOf(AboutPage)).apply(this, arguments));\n }\n\n _createClass(AboutPage, [{\n key: 'render',\n value: function render() {\n return _react2.default.createElement(\n 'div',\n null,\n _react2.default.createElement(_SEO2.default, { pageTitle: 'About', pageUri: 'about' }),\n _react2.default.createElement(_NavBar2.default, null),\n _react2.default.createElement(\n 'div',\n { className: 'row row--padded' },\n _react2.default.createElement(\n 'div',\n { className: 'column column--5 column--med-10 align-content-top' },\n _react2.default.createElement(\n 'div',\n { className: 'column column--8 column--med-10' },\n _react2.default.createElement(\n 'p',\n { className: 'pull-quote' },\n 'Spee.ch is an open-source project. Please contribute to the existing site, or fork it and make your own.'\n ),\n _react2.default.createElement(\n 'p',\n null,\n _react2.default.createElement(\n 'a',\n { className: 'link--primary', target: '_blank', href: 'https://twitter.com/spee_ch' },\n 'TWITTER'\n )\n ),\n _react2.default.createElement(\n 'p',\n null,\n _react2.default.createElement(\n 'a',\n { className: 'link--primary', target: '_blank', href: 'https://github.com/lbryio/spee.ch' },\n 'GITHUB'\n )\n ),\n _react2.default.createElement(\n 'p',\n null,\n _react2.default.createElement(\n 'a',\n { className: 'link--primary', target: '_blank', href: 'https://discord.gg/YjYbwhS' },\n 'DISCORD CHANNEL'\n )\n ),\n _react2.default.createElement(\n 'p',\n null,\n _react2.default.createElement(\n 'a',\n { className: 'link--primary', target: '_blank', href: 'https://github.com/lbryio/spee.ch/blob/master/README.md' },\n 'DOCUMENTATION'\n )\n )\n )\n ),\n _react2.default.createElement(\n 'div',\n { className: 'column column--5 column--med-10 align-content-top' },\n _react2.default.createElement(\n 'div',\n { className: 'column column--8 column--med-10' },\n _react2.default.createElement(\n 'p',\n null,\n 'Spee.ch is a media-hosting site that reads from and publishes content to the ',\n _react2.default.createElement(\n 'a',\n { className: 'link--primary', href: 'https://lbry.io' },\n 'LBRY'\n ),\n ' blockchain.'\n ),\n _react2.default.createElement(\n 'p',\n null,\n 'Spee.ch is a hosting service, but with the added benefit that it stores your content on a decentralized network of computers -- the LBRY network. This means that your images are stored in multiple locations without a single point of failure.'\n ),\n _react2.default.createElement(\n 'h3',\n null,\n 'Contribute'\n ),\n _react2.default.createElement(\n 'p',\n null,\n 'If you have an idea for your own spee.ch-like site on top of LBRY, fork our ',\n _react2.default.createElement(\n 'a',\n { className: 'link--primary', href: 'https://github.com/lbryio/spee.ch' },\n 'github repo'\n ),\n ' and go to town!'\n ),\n _react2.default.createElement(\n 'p',\n null,\n 'If you want to improve spee.ch, join our ',\n _react2.default.createElement(\n 'a',\n { className: 'link--primary', href: 'https://discord.gg/YjYbwhS' },\n 'discord channel'\n ),\n ' or solve one of our ',\n _react2.default.createElement(\n 'a',\n { className: 'link--primary', href: 'https://github.com/lbryio/spee.ch/issues' },\n 'github issues'\n ),\n '.'\n )\n )\n )\n )\n );\n }\n }]);\n\n return AboutPage;\n}(_react2.default.Component);\n\n;\n\nexports.default = AboutPage;\n\n/***/ }),\n/* 118 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _reactRedux = __webpack_require__(1);\n\nvar _view = __webpack_require__(119);\n\nvar _view2 = _interopRequireDefault(_view);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar mapStateToProps = function mapStateToProps(_ref) {\n var channel = _ref.channel;\n\n return {\n loggedInChannelName: channel.loggedInChannel.name\n };\n};\n\nexports.default = (0, _reactRedux.connect)(mapStateToProps, null)(_view2.default);\n\n/***/ }),\n/* 119 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _reactRouterDom = __webpack_require__(4);\n\nvar _SEO = __webpack_require__(9);\n\nvar _SEO2 = _interopRequireDefault(_SEO);\n\nvar _NavBar = __webpack_require__(7);\n\nvar _NavBar2 = _interopRequireDefault(_NavBar);\n\nvar _ChannelLoginForm = __webpack_require__(38);\n\nvar _ChannelLoginForm2 = _interopRequireDefault(_ChannelLoginForm);\n\nvar _ChannelCreateForm = __webpack_require__(39);\n\nvar _ChannelCreateForm2 = _interopRequireDefault(_ChannelCreateForm);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar LoginPage = function (_React$Component) {\n _inherits(LoginPage, _React$Component);\n\n function LoginPage() {\n _classCallCheck(this, LoginPage);\n\n return _possibleConstructorReturn(this, (LoginPage.__proto__ || Object.getPrototypeOf(LoginPage)).apply(this, arguments));\n }\n\n _createClass(LoginPage, [{\n key: 'componentWillReceiveProps',\n value: function componentWillReceiveProps(newProps) {\n // re-route the user to the homepage if the user is logged in\n if (newProps.loggedInChannelName !== this.props.loggedInChannelName) {\n this.props.history.push('/');\n }\n }\n }, {\n key: 'render',\n value: function render() {\n return _react2.default.createElement(\n 'div',\n null,\n _react2.default.createElement(_SEO2.default, { pageTitle: 'Login', pageUri: 'login' }),\n _react2.default.createElement(_NavBar2.default, null),\n _react2.default.createElement(\n 'div',\n { className: 'row row--padded' },\n _react2.default.createElement(\n 'div',\n { className: 'column column--5 column--med-10 align-content-top' },\n _react2.default.createElement(\n 'div',\n { className: 'column column--8 column--med-10' },\n _react2.default.createElement(\n 'p',\n null,\n 'Channels allow you to publish and group content under an identity. You can create a channel for yourself, or share one with like-minded friends. You can create 1 channel, or 100, so whether you\\'re ',\n _react2.default.createElement(\n 'a',\n { className: 'link--primary', target: '_blank', href: '/@catalonia2017:43dcf47163caa21d8404d9fe9b30f78ef3e146a8' },\n 'documenting important events'\n ),\n ', or making a public repository for ',\n _react2.default.createElement(\n 'a',\n { className: 'link--primary', target: '_blank', href: '/@catGifs' },\n 'cat gifs'\n ),\n ' (password: \\'1234\\'), try creating a channel for it!'\n )\n )\n ),\n _react2.default.createElement(\n 'div',\n { className: 'column column--5 column--med-10 align-content-top' },\n _react2.default.createElement(\n 'div',\n { className: 'column column--8 column--med-10' },\n _react2.default.createElement(\n 'h3',\n { className: 'h3--no-bottom' },\n 'Log in to an existing channel:'\n ),\n _react2.default.createElement(_ChannelLoginForm2.default, null),\n _react2.default.createElement(\n 'h3',\n { className: 'h3--no-bottom' },\n 'Create a brand new channel:'\n ),\n _react2.default.createElement(_ChannelCreateForm2.default, null)\n )\n )\n )\n );\n }\n }]);\n\n return LoginPage;\n}(_react2.default.Component);\n\n;\n\nexports.default = (0, _reactRouterDom.withRouter)(LoginPage);\n\n/***/ }),\n/* 120 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _reactRedux = __webpack_require__(1);\n\nvar _show = __webpack_require__(8);\n\nvar _view = __webpack_require__(121);\n\nvar _view2 = _interopRequireDefault(_view);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar mapStateToProps = function mapStateToProps(_ref) {\n var show = _ref.show;\n\n return {\n error: show.request.error,\n requestType: show.request.type\n };\n};\n\nvar mapDispatchToProps = {\n onHandleShowPageUri: _show.onHandleShowPageUri\n};\n\nexports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(_view2.default);\n\n/***/ }),\n/* 121 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _ErrorPage = __webpack_require__(21);\n\nvar _ErrorPage2 = _interopRequireDefault(_ErrorPage);\n\nvar _ShowAssetLite = __webpack_require__(122);\n\nvar _ShowAssetLite2 = _interopRequireDefault(_ShowAssetLite);\n\nvar _ShowAssetDetails = __webpack_require__(125);\n\nvar _ShowAssetDetails2 = _interopRequireDefault(_ShowAssetDetails);\n\nvar _ShowChannel = __webpack_require__(131);\n\nvar _ShowChannel2 = _interopRequireDefault(_ShowChannel);\n\nvar _show_request_types = __webpack_require__(40);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar ShowPage = function (_React$Component) {\n _inherits(ShowPage, _React$Component);\n\n function ShowPage() {\n _classCallCheck(this, ShowPage);\n\n return _possibleConstructorReturn(this, (ShowPage.__proto__ || Object.getPrototypeOf(ShowPage)).apply(this, arguments));\n }\n\n _createClass(ShowPage, [{\n key: 'componentDidMount',\n value: function componentDidMount() {\n this.props.onHandleShowPageUri(this.props.match.params);\n }\n }, {\n key: 'componentWillReceiveProps',\n value: function componentWillReceiveProps(nextProps) {\n if (nextProps.match.params !== this.props.match.params) {\n this.props.onHandleShowPageUri(nextProps.match.params);\n }\n }\n }, {\n key: 'render',\n value: function render() {\n var _props = this.props,\n error = _props.error,\n requestType = _props.requestType;\n\n if (error) {\n return _react2.default.createElement(_ErrorPage2.default, { error: error });\n }\n switch (requestType) {\n case _show_request_types.CHANNEL:\n return _react2.default.createElement(_ShowChannel2.default, null);\n case _show_request_types.ASSET_LITE:\n return _react2.default.createElement(_ShowAssetLite2.default, null);\n case _show_request_types.ASSET_DETAILS:\n return _react2.default.createElement(_ShowAssetDetails2.default, null);\n default:\n return _react2.default.createElement(\n 'p',\n null,\n 'loading...'\n );\n }\n }\n }]);\n\n return ShowPage;\n}(_react2.default.Component);\n\n;\n\nexports.default = ShowPage;\n\n/***/ }),\n/* 122 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _reactRedux = __webpack_require__(1);\n\nvar _view = __webpack_require__(123);\n\nvar _view2 = _interopRequireDefault(_view);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar mapStateToProps = function mapStateToProps(_ref) {\n var show = _ref.show;\n\n // select request info\n var requestId = show.request.id;\n // select asset info\n var asset = void 0;\n var request = show.requestList[requestId] || null;\n var assetList = show.assetList;\n if (request && assetList) {\n var assetKey = request.key; // note: just store this in the request\n asset = assetList[assetKey] || null;\n };\n // return props\n return {\n asset: asset\n };\n};\n\nexports.default = (0, _reactRedux.connect)(mapStateToProps, null)(_view2.default);\n\n/***/ }),\n/* 123 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _SEO = __webpack_require__(9);\n\nvar _SEO2 = _interopRequireDefault(_SEO);\n\nvar _reactRouterDom = __webpack_require__(4);\n\nvar _AssetDisplay = __webpack_require__(41);\n\nvar _AssetDisplay2 = _interopRequireDefault(_AssetDisplay);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar ShowLite = function (_React$Component) {\n _inherits(ShowLite, _React$Component);\n\n function ShowLite() {\n _classCallCheck(this, ShowLite);\n\n return _possibleConstructorReturn(this, (ShowLite.__proto__ || Object.getPrototypeOf(ShowLite)).apply(this, arguments));\n }\n\n _createClass(ShowLite, [{\n key: 'render',\n value: function render() {\n var asset = this.props.asset;\n\n if (asset) {\n var _asset$claimData = asset.claimData,\n name = _asset$claimData.name,\n claimId = _asset$claimData.claimId;\n\n return _react2.default.createElement(\n 'div',\n { className: 'row row--tall flex-container--column flex-container--center-center show-lite-container' },\n _react2.default.createElement(_SEO2.default, { pageTitle: name, asset: asset }),\n _react2.default.createElement(_AssetDisplay2.default, null),\n _react2.default.createElement(\n _reactRouterDom.Link,\n { id: 'asset-boilerpate', className: 'link--primary fine-print', to: '/' + claimId + '/' + name },\n 'hosted via Spee.ch'\n )\n );\n }\n return _react2.default.createElement(\n 'div',\n { className: 'row row--tall row--padded flex-container--column flex-container--center-center' },\n _react2.default.createElement(\n 'p',\n null,\n 'loading asset data...'\n )\n );\n }\n }]);\n\n return ShowLite;\n}(_react2.default.Component);\n\n;\n\nexports.default = ShowLite;\n\n/***/ }),\n/* 124 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _ProgressBar = __webpack_require__(20);\n\nvar _ProgressBar2 = _interopRequireDefault(_ProgressBar);\n\nvar _asset_display_states = __webpack_require__(34);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar AssetDisplay = function (_React$Component) {\n _inherits(AssetDisplay, _React$Component);\n\n function AssetDisplay() {\n _classCallCheck(this, AssetDisplay);\n\n return _possibleConstructorReturn(this, (AssetDisplay.__proto__ || Object.getPrototypeOf(AssetDisplay)).apply(this, arguments));\n }\n\n _createClass(AssetDisplay, [{\n key: 'componentDidMount',\n value: function componentDidMount() {\n var _props$asset$claimDat = this.props.asset.claimData,\n name = _props$asset$claimDat.name,\n claimId = _props$asset$claimDat.claimId;\n\n this.props.onFileRequest(name, claimId);\n }\n }, {\n key: 'render',\n value: function render() {\n var _props = this.props,\n status = _props.status,\n error = _props.error,\n _props$asset$claimDat2 = _props.asset.claimData,\n name = _props$asset$claimDat2.name,\n claimId = _props$asset$claimDat2.claimId,\n contentType = _props$asset$claimDat2.contentType,\n fileExt = _props$asset$claimDat2.fileExt,\n thumbnail = _props$asset$claimDat2.thumbnail;\n\n return _react2.default.createElement(\n 'div',\n { id: 'asset-display-component' },\n status === _asset_display_states.LOCAL_CHECK && _react2.default.createElement(\n 'div',\n null,\n _react2.default.createElement(\n 'p',\n null,\n 'Checking to see if Spee.ch has your asset locally...'\n )\n ),\n status === _asset_display_states.UNAVAILABLE && _react2.default.createElement(\n 'div',\n null,\n _react2.default.createElement(\n 'p',\n null,\n 'Sit tight, we\\'re searching the LBRY blockchain for your asset!'\n ),\n _react2.default.createElement(_ProgressBar2.default, { size: 12 }),\n _react2.default.createElement(\n 'p',\n null,\n 'Curious what magic is happening here? ',\n _react2.default.createElement(\n 'a',\n { className: 'link--primary', target: 'blank', href: 'https://lbry.io/faq/what-is-lbry' },\n 'Learn more.'\n )\n )\n ),\n status === _asset_display_states.ERROR && _react2.default.createElement(\n 'div',\n null,\n _react2.default.createElement(\n 'p',\n null,\n 'Unfortunately, we couldn\\'t download your asset from LBRY. You can help us out by sharing the below error message in the ',\n _react2.default.createElement(\n 'a',\n { className: 'link--primary', href: 'https://discord.gg/YjYbwhS', target: '_blank' },\n 'LBRY discord'\n ),\n '.'\n ),\n _react2.default.createElement(\n 'i',\n null,\n _react2.default.createElement(\n 'p',\n { id: 'error-message' },\n error\n )\n )\n ),\n status === _asset_display_states.AVAILABLE && function () {\n switch (contentType) {\n case 'image/jpeg':\n case 'image/jpg':\n case 'image/png':\n return _react2.default.createElement('img', {\n className: 'asset',\n src: '/' + claimId + '/' + name + '.' + fileExt,\n alt: name });\n case 'image/gif':\n return _react2.default.createElement('img', {\n className: 'asset',\n src: '/' + claimId + '/' + name + '.' + fileExt,\n alt: name\n });\n case 'video/mp4':\n return _react2.default.createElement(\n 'video',\n { className: 'asset video', controls: true, poster: thumbnail },\n _react2.default.createElement('source', {\n src: '/' + claimId + '/' + name + '.' + fileExt\n }),\n _react2.default.createElement(\n 'p',\n null,\n 'Your browser does not support the ',\n _react2.default.createElement(\n 'code',\n null,\n 'video'\n ),\n ' element.'\n )\n );\n default:\n return _react2.default.createElement(\n 'p',\n null,\n 'Unsupported file type'\n );\n }\n }()\n );\n }\n }]);\n\n return AssetDisplay;\n}(_react2.default.Component);\n\n;\n\nexports.default = AssetDisplay;\n\n/***/ }),\n/* 125 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _reactRedux = __webpack_require__(1);\n\nvar _view = __webpack_require__(126);\n\nvar _view2 = _interopRequireDefault(_view);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar mapStateToProps = function mapStateToProps(_ref) {\n var show = _ref.show;\n\n // select request info\n var requestId = show.request.id;\n // select asset info\n var asset = void 0;\n var request = show.requestList[requestId] || null;\n var assetList = show.assetList;\n if (request && assetList) {\n var assetKey = request.key; // note: just store this in the request\n asset = assetList[assetKey] || null;\n };\n // return props\n return {\n asset: asset\n };\n};\n\nexports.default = (0, _reactRedux.connect)(mapStateToProps, null)(_view2.default);\n\n/***/ }),\n/* 126 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _SEO = __webpack_require__(9);\n\nvar _SEO2 = _interopRequireDefault(_SEO);\n\nvar _NavBar = __webpack_require__(7);\n\nvar _NavBar2 = _interopRequireDefault(_NavBar);\n\nvar _ErrorPage = __webpack_require__(21);\n\nvar _ErrorPage2 = _interopRequireDefault(_ErrorPage);\n\nvar _AssetTitle = __webpack_require__(127);\n\nvar _AssetTitle2 = _interopRequireDefault(_AssetTitle);\n\nvar _AssetDisplay = __webpack_require__(41);\n\nvar _AssetDisplay2 = _interopRequireDefault(_AssetDisplay);\n\nvar _AssetInfo = __webpack_require__(129);\n\nvar _AssetInfo2 = _interopRequireDefault(_AssetInfo);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar ShowAssetDetails = function (_React$Component) {\n _inherits(ShowAssetDetails, _React$Component);\n\n function ShowAssetDetails() {\n _classCallCheck(this, ShowAssetDetails);\n\n return _possibleConstructorReturn(this, (ShowAssetDetails.__proto__ || Object.getPrototypeOf(ShowAssetDetails)).apply(this, arguments));\n }\n\n _createClass(ShowAssetDetails, [{\n key: 'render',\n value: function render() {\n var asset = this.props.asset;\n\n if (asset) {\n var name = asset.claimData.name;\n\n return _react2.default.createElement(\n 'div',\n null,\n _react2.default.createElement(_SEO2.default, { pageTitle: name + ' - details', asset: asset }),\n _react2.default.createElement(_NavBar2.default, null),\n _react2.default.createElement(\n 'div',\n { className: 'row row--tall row--padded' },\n _react2.default.createElement(\n 'div',\n { className: 'column column--10' },\n _react2.default.createElement(_AssetTitle2.default, null)\n ),\n _react2.default.createElement(\n 'div',\n { className: 'column column--5 column--sml-10 align-content-top' },\n _react2.default.createElement(\n 'div',\n { className: 'row row--padded show-details-container' },\n _react2.default.createElement(_AssetDisplay2.default, null)\n )\n ),\n _react2.default.createElement(\n 'div',\n { className: 'column column--5 column--sml-10 align-content-top' },\n _react2.default.createElement(\n 'div',\n { className: 'row row--padded' },\n _react2.default.createElement(_AssetInfo2.default, null)\n )\n )\n ),\n '}'\n );\n };\n return _react2.default.createElement(_ErrorPage2.default, { error: 'loading asset data...' });\n }\n }]);\n\n return ShowAssetDetails;\n}(_react2.default.Component);\n\n;\n\nexports.default = ShowAssetDetails;\n\n/***/ }),\n/* 127 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _reactRedux = __webpack_require__(1);\n\nvar _view = __webpack_require__(128);\n\nvar _view2 = _interopRequireDefault(_view);\n\nvar _show = __webpack_require__(13);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar mapStateToProps = function mapStateToProps(_ref) {\n var show = _ref.show;\n\n var _selectAsset = (0, _show.selectAsset)(show),\n title = _selectAsset.claimData.title;\n\n return {\n title: title\n };\n};\n\nexports.default = (0, _reactRedux.connect)(mapStateToProps, null)(_view2.default);\n\n/***/ }),\n/* 128 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar AssetTitle = function AssetTitle(_ref) {\n var title = _ref.title;\n\n return _react2.default.createElement(\n 'div',\n null,\n _react2.default.createElement(\n 'span',\n { className: 'text--large' },\n title\n )\n );\n};\n\nexports.default = AssetTitle;\n\n/***/ }),\n/* 129 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _reactRedux = __webpack_require__(1);\n\nvar _view = __webpack_require__(130);\n\nvar _view2 = _interopRequireDefault(_view);\n\nvar _show = __webpack_require__(13);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar mapStateToProps = function mapStateToProps(_ref) {\n var show = _ref.show;\n\n // select asset\n var asset = (0, _show.selectAsset)(show);\n // return props\n return {\n asset: asset\n };\n};\n\nexports.default = (0, _reactRedux.connect)(mapStateToProps, null)(_view2.default);\n\n/***/ }),\n/* 130 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _reactRouterDom = __webpack_require__(4);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar AssetInfo = function (_React$Component) {\n _inherits(AssetInfo, _React$Component);\n\n function AssetInfo(props) {\n _classCallCheck(this, AssetInfo);\n\n var _this = _possibleConstructorReturn(this, (AssetInfo.__proto__ || Object.getPrototypeOf(AssetInfo)).call(this, props));\n\n _this.copyToClipboard = _this.copyToClipboard.bind(_this);\n return _this;\n }\n\n _createClass(AssetInfo, [{\n key: 'copyToClipboard',\n value: function copyToClipboard(event) {\n var elementToCopy = event.target.dataset.elementtocopy;\n var element = document.getElementById(elementToCopy);\n element.select();\n try {\n document.execCommand('copy');\n } catch (err) {\n this.setState({ error: 'Oops, unable to copy' });\n }\n }\n }, {\n key: 'render',\n value: function render() {\n var _props$asset = this.props.asset,\n shortId = _props$asset.shortId,\n _props$asset$claimDat = _props$asset.claimData,\n channelName = _props$asset$claimDat.channelName,\n certificateId = _props$asset$claimDat.certificateId,\n description = _props$asset$claimDat.description,\n name = _props$asset$claimDat.name,\n claimId = _props$asset$claimDat.claimId,\n fileExt = _props$asset$claimDat.fileExt,\n contentType = _props$asset$claimDat.contentType,\n thumbnail = _props$asset$claimDat.thumbnail,\n host = _props$asset$claimDat.host;\n\n return _react2.default.createElement(\n 'div',\n null,\n channelName && _react2.default.createElement(\n 'div',\n { className: 'row row--padded row--wide row--no-top' },\n _react2.default.createElement(\n 'div',\n { className: 'column column--2 column--med-10' },\n _react2.default.createElement(\n 'span',\n { className: 'text' },\n 'Channel:'\n )\n ),\n _react2.default.createElement(\n 'div',\n { className: 'column column--8 column--med-10' },\n _react2.default.createElement(\n 'span',\n { className: 'text' },\n _react2.default.createElement(\n _reactRouterDom.Link,\n { to: '/' + channelName + ':' + certificateId },\n channelName\n )\n )\n )\n ),\n description && _react2.default.createElement(\n 'div',\n { className: 'row row--padded row--wide row--no-top' },\n _react2.default.createElement(\n 'span',\n { className: 'text' },\n description\n )\n ),\n _react2.default.createElement(\n 'div',\n { id: 'show-share-buttons' },\n _react2.default.createElement(\n 'div',\n { className: 'row row--padded row--wide row--no-top' },\n _react2.default.createElement(\n 'div',\n { className: 'column column--2 column--med-10' },\n _react2.default.createElement(\n 'span',\n { className: 'text' },\n 'Share:'\n )\n ),\n _react2.default.createElement(\n 'div',\n { className: 'column column--8 column--med-10' },\n _react2.default.createElement(\n 'div',\n {\n className: 'row row--short row--wide flex-container--row flex-container--space-between-bottom flex-container--wrap' },\n _react2.default.createElement(\n 'a',\n { className: 'link--primary', target: '_blank', href: 'https://twitter.com/intent/tweet?text=' + host + '/' + shortId + '/' + name },\n 'twitter'\n ),\n _react2.default.createElement(\n 'a',\n { className: 'link--primary', target: '_blank', href: 'https://www.facebook.com/sharer/sharer.php?u=' + host + '/' + shortId + '/' + name },\n 'facebook'\n ),\n _react2.default.createElement(\n 'a',\n { className: 'link--primary', target: '_blank', href: 'http://tumblr.com/widgets/share/tool?canonicalUrl=' + host + '/' + shortId + '/' + name },\n 'tumblr'\n ),\n _react2.default.createElement(\n 'a',\n { className: 'link--primary', target: '_blank', href: 'https://www.reddit.com/submit?url=' + host + '/' + shortId + '/' + name + '&title=' + name },\n 'reddit'\n )\n )\n )\n )\n ),\n _react2.default.createElement(\n 'div',\n { className: 'row row--padded row--wide row--no-top' },\n _react2.default.createElement(\n 'div',\n { id: 'show-short-link' },\n _react2.default.createElement(\n 'div',\n { className: 'column column--2 column--med-10' },\n _react2.default.createElement(\n 'span',\n { className: 'text' },\n 'Link:'\n )\n ),\n _react2.default.createElement(\n 'div',\n { className: 'column column--8 column--med-10' },\n _react2.default.createElement(\n 'div',\n { className: 'row row--short row--wide' },\n _react2.default.createElement(\n 'div',\n { className: 'column column--7' },\n _react2.default.createElement(\n 'div',\n { className: 'input-error', id: 'input-error-copy-short-link', hidden: 'true' },\n 'error here'\n ),\n _react2.default.createElement('input', { type: 'text', id: 'short-link', className: 'input-disabled input-text--full-width', readOnly: true,\n spellCheck: 'false',\n value: host + '/' + shortId + '/' + name + '.' + fileExt,\n onClick: this.select })\n ),\n _react2.default.createElement('div', { className: 'column column--1' }),\n _react2.default.createElement(\n 'div',\n { className: 'column column--2' },\n _react2.default.createElement(\n 'button',\n { className: 'button--primary button--wide', 'data-elementtocopy': 'short-link',\n onClick: this.copyToClipboard },\n 'copy'\n )\n )\n )\n )\n ),\n _react2.default.createElement(\n 'div',\n { id: 'show-embed-code' },\n _react2.default.createElement(\n 'div',\n { className: 'column column--2 column--med-10' },\n _react2.default.createElement(\n 'span',\n { className: 'text' },\n 'Embed:'\n )\n ),\n _react2.default.createElement(\n 'div',\n { className: 'column column--8 column--med-10' },\n _react2.default.createElement(\n 'div',\n { className: 'row row--short row--wide' },\n _react2.default.createElement(\n 'div',\n { className: 'column column--7' },\n _react2.default.createElement(\n 'div',\n { className: 'input-error', id: 'input-error-copy-embed-text', hidden: 'true' },\n 'error here'\n ),\n contentType === 'video/mp4' ? _react2.default.createElement('input', { type: 'text', id: 'embed-text', className: 'input-disabled input-text--full-width', readOnly: true,\n onClick: this.select, spellCheck: 'false',\n value: '' }) : _react2.default.createElement('input', { type: 'text', id: 'embed-text', className: 'input-disabled input-text--full-width', readOnly: true,\n onClick: this.select, spellCheck: 'false',\n value: ''\n })\n ),\n _react2.default.createElement('div', { className: 'column column--1' }),\n _react2.default.createElement(\n 'div',\n { className: 'column column--2' },\n _react2.default.createElement(\n 'button',\n { className: 'button--primary button--wide', 'data-elementtocopy': 'embed-text',\n onClick: this.copyToClipboard },\n 'copy'\n )\n )\n )\n )\n )\n ),\n _react2.default.createElement(\n 'div',\n { className: 'flex-container--row flex-container--space-between-bottom' },\n _react2.default.createElement(\n _reactRouterDom.Link,\n { className: 'link--primary', to: '/' + shortId + '/' + name + '.' + fileExt },\n _react2.default.createElement(\n 'span',\n {\n className: 'text' },\n 'Direct Link'\n )\n ),\n _react2.default.createElement(\n 'a',\n { className: 'link--primary', href: host + '/' + claimId + '/' + name + '.' + fileExt, download: name },\n 'Download'\n ),\n _react2.default.createElement(\n 'a',\n { className: 'link--primary', target: '_blank', href: 'https://lbry.io/dmca' },\n 'Report'\n )\n )\n );\n }\n }]);\n\n return AssetInfo;\n}(_react2.default.Component);\n\n;\n\nexports.default = AssetInfo;\n\n/***/ }),\n/* 131 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _reactRedux = __webpack_require__(1);\n\nvar _view = __webpack_require__(132);\n\nvar _view2 = _interopRequireDefault(_view);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar mapStateToProps = function mapStateToProps(_ref) {\n var show = _ref.show;\n\n // select request info\n var requestId = show.request.id;\n // select request\n var previousRequest = show.requestList[requestId] || null;\n // select channel\n var channel = void 0;\n if (previousRequest) {\n var channelKey = previousRequest.key;\n channel = show.channelList[channelKey] || null;\n }\n return {\n channel: channel\n };\n};\n\nexports.default = (0, _reactRedux.connect)(mapStateToProps, null)(_view2.default);\n\n/***/ }),\n/* 132 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _SEO = __webpack_require__(9);\n\nvar _SEO2 = _interopRequireDefault(_SEO);\n\nvar _ErrorPage = __webpack_require__(21);\n\nvar _ErrorPage2 = _interopRequireDefault(_ErrorPage);\n\nvar _NavBar = __webpack_require__(7);\n\nvar _NavBar2 = _interopRequireDefault(_NavBar);\n\nvar _ChannelClaimsDisplay = __webpack_require__(133);\n\nvar _ChannelClaimsDisplay2 = _interopRequireDefault(_ChannelClaimsDisplay);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar ShowChannel = function (_React$Component) {\n _inherits(ShowChannel, _React$Component);\n\n function ShowChannel() {\n _classCallCheck(this, ShowChannel);\n\n return _possibleConstructorReturn(this, (ShowChannel.__proto__ || Object.getPrototypeOf(ShowChannel)).apply(this, arguments));\n }\n\n _createClass(ShowChannel, [{\n key: 'render',\n value: function render() {\n var channel = this.props.channel;\n\n if (channel) {\n var name = channel.name,\n longId = channel.longId,\n shortId = channel.shortId;\n\n return _react2.default.createElement(\n 'div',\n null,\n _react2.default.createElement(_SEO2.default, { pageTitle: name, channel: channel }),\n _react2.default.createElement(_NavBar2.default, null),\n _react2.default.createElement(\n 'div',\n { className: 'row row--tall row--padded' },\n _react2.default.createElement(\n 'div',\n { className: 'column column--10' },\n _react2.default.createElement(\n 'h2',\n null,\n 'channel name: ',\n name\n ),\n _react2.default.createElement(\n 'p',\n { className: 'fine-print' },\n 'full channel id: ',\n longId\n ),\n _react2.default.createElement(\n 'p',\n { className: 'fine-print' },\n 'short channel id: ',\n shortId\n )\n ),\n _react2.default.createElement(\n 'div',\n { className: 'column column--10' },\n _react2.default.createElement(_ChannelClaimsDisplay2.default, null)\n )\n )\n );\n };\n return _react2.default.createElement(_ErrorPage2.default, { error: 'loading channel data...' });\n }\n }]);\n\n return ShowChannel;\n}(_react2.default.Component);\n\n;\n\nexports.default = ShowChannel;\n\n/***/ }),\n/* 133 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _reactRedux = __webpack_require__(1);\n\nvar _show = __webpack_require__(8);\n\nvar _view = __webpack_require__(134);\n\nvar _view2 = _interopRequireDefault(_view);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar mapStateToProps = function mapStateToProps(_ref) {\n var show = _ref.show;\n\n // select channel key\n var request = show.requestList[show.request.id];\n var channelKey = request.key;\n // select channel claims\n var channel = show.channelList[channelKey] || null;\n // return props\n return {\n channelKey: channelKey,\n channel: channel\n };\n};\n\nvar mapDispatchToProps = {\n onUpdateChannelClaims: _show.onUpdateChannelClaims\n};\n\nexports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(_view2.default);\n\n/***/ }),\n/* 134 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _AssetPreview = __webpack_require__(135);\n\nvar _AssetPreview2 = _interopRequireDefault(_AssetPreview);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar ChannelClaimsDisplay = function (_React$Component) {\n _inherits(ChannelClaimsDisplay, _React$Component);\n\n function ChannelClaimsDisplay(props) {\n _classCallCheck(this, ChannelClaimsDisplay);\n\n var _this = _possibleConstructorReturn(this, (ChannelClaimsDisplay.__proto__ || Object.getPrototypeOf(ChannelClaimsDisplay)).call(this, props));\n\n _this.showNextResultsPage = _this.showNextResultsPage.bind(_this);\n _this.showPreviousResultsPage = _this.showPreviousResultsPage.bind(_this);\n return _this;\n }\n\n _createClass(ChannelClaimsDisplay, [{\n key: 'showPreviousResultsPage',\n value: function showPreviousResultsPage() {\n var currentPage = this.props.channel.claimsData.currentPage;\n\n var previousPage = parseInt(currentPage) - 1;\n this.showNewPage(previousPage);\n }\n }, {\n key: 'showNextResultsPage',\n value: function showNextResultsPage() {\n var currentPage = this.props.channel.claimsData.currentPage;\n\n var nextPage = parseInt(currentPage) + 1;\n this.showNewPage(nextPage);\n }\n }, {\n key: 'showNewPage',\n value: function showNewPage(page) {\n var _props = this.props,\n channelKey = _props.channelKey,\n _props$channel = _props.channel,\n name = _props$channel.name,\n longId = _props$channel.longId;\n\n this.props.onUpdateChannelClaims(channelKey, name, longId, page);\n }\n }, {\n key: 'render',\n value: function render() {\n var _props$channel$claims = this.props.channel.claimsData,\n claims = _props$channel$claims.claims,\n currentPage = _props$channel$claims.currentPage,\n totalPages = _props$channel$claims.totalPages;\n\n return _react2.default.createElement(\n 'div',\n { className: 'row row--tall' },\n claims.length > 0 ? _react2.default.createElement(\n 'div',\n null,\n claims.map(function (claim, index) {\n return _react2.default.createElement(_AssetPreview2.default, {\n claimData: claim,\n key: claim.name + '-' + index\n });\n }),\n _react2.default.createElement(\n 'div',\n null,\n currentPage > 1 && _react2.default.createElement(\n 'button',\n { className: 'button--secondary', onClick: this.showPreviousResultsPage },\n 'Previous Page'\n ),\n currentPage < totalPages && _react2.default.createElement(\n 'button',\n { className: 'button--secondary', onClick: this.showNextResultsPage },\n 'Next Page'\n )\n )\n ) : _react2.default.createElement(\n 'p',\n null,\n 'There are no claims in this channel'\n )\n );\n }\n }]);\n\n return ChannelClaimsDisplay;\n}(_react2.default.Component);\n\n;\n\nexports.default = ChannelClaimsDisplay;\n\n/***/ }),\n/* 135 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _reactRouterDom = __webpack_require__(4);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar _require = __webpack_require__(3),\n defaultThumbnail = _require.claim.defaultThumbnail;\n\nvar AssetPreview = function AssetPreview(_ref) {\n var _ref$claimData = _ref.claimData,\n name = _ref$claimData.name,\n claimId = _ref$claimData.claimId,\n fileExt = _ref$claimData.fileExt,\n contentType = _ref$claimData.contentType,\n thumbnail = _ref$claimData.thumbnail;\n\n var directSourceLink = claimId + '/' + name + '.' + fileExt;\n var showUrlLink = '/' + claimId + '/' + name;\n return _react2.default.createElement(\n 'div',\n { className: 'asset-holder' },\n _react2.default.createElement(\n _reactRouterDom.Link,\n { to: showUrlLink },\n function () {\n switch (contentType) {\n case 'image/jpeg':\n case 'image/jpg':\n case 'image/png':\n case 'image/gif':\n return _react2.default.createElement('img', {\n className: 'asset-preview',\n src: directSourceLink,\n alt: name\n });\n case 'video/mp4':\n return _react2.default.createElement('img', {\n className: 'asset-preview video',\n src: thumbnail || defaultThumbnail,\n alt: name\n });\n default:\n return _react2.default.createElement(\n 'p',\n null,\n 'unsupported file type'\n );\n }\n }()\n )\n );\n};\n\nexports.default = AssetPreview;\n\n/***/ }),\n/* 136 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _NavBar = __webpack_require__(7);\n\nvar _NavBar2 = _interopRequireDefault(_NavBar);\n\nvar _reactHelmet = __webpack_require__(14);\n\nvar _reactHelmet2 = _interopRequireDefault(_reactHelmet);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar _require = __webpack_require__(3),\n _require$site = _require.site,\n title = _require$site.title,\n host = _require$site.host;\n\nvar FourOhForPage = function (_React$Component) {\n _inherits(FourOhForPage, _React$Component);\n\n function FourOhForPage() {\n _classCallCheck(this, FourOhForPage);\n\n return _possibleConstructorReturn(this, (FourOhForPage.__proto__ || Object.getPrototypeOf(FourOhForPage)).apply(this, arguments));\n }\n\n _createClass(FourOhForPage, [{\n key: 'render',\n value: function render() {\n return _react2.default.createElement(\n 'div',\n null,\n _react2.default.createElement(\n _reactHelmet2.default,\n null,\n _react2.default.createElement(\n 'title',\n null,\n title,\n ' - 404'\n ),\n _react2.default.createElement('link', { rel: 'canonical', href: host + '/404' })\n ),\n _react2.default.createElement(_NavBar2.default, null),\n _react2.default.createElement(\n 'div',\n { className: 'row row--padded' },\n _react2.default.createElement(\n 'h2',\n null,\n '404'\n ),\n _react2.default.createElement(\n 'p',\n null,\n 'That page does not exist'\n )\n )\n );\n }\n }]);\n\n return FourOhForPage;\n}(_react2.default.Component);\n\n;\n\nexports.default = FourOhForPage;\n\n/***/ }),\n/* 137 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _require = __webpack_require__(17),\n sendGAServeEvent = _require.sendGAServeEvent;\n\nvar _require2 = __webpack_require__(138),\n determineResponseType = _require2.determineResponseType,\n flipClaimNameAndIdForBackwardsCompatibility = _require2.flipClaimNameAndIdForBackwardsCompatibility,\n logRequestData = _require2.logRequestData,\n getClaimIdAndServeAsset = _require2.getClaimIdAndServeAsset;\n\nvar lbryUri = __webpack_require__(139);\nvar handleShowRender = __webpack_require__(140);\nvar SERVE = 'SERVE';\n\nmodule.exports = function (app) {\n // route to serve a specific asset using the channel or claim id\n app.get('/:identifier/:claim', function (req, res) {\n var headers = req.headers,\n ip = req.ip,\n originalUrl = req.originalUrl,\n params = req.params;\n // decide if this is a show request\n\n var hasFileExtension = void 0;\n try {\n var _lbryUri$parseModifie = lbryUri.parseModifier(params.claim);\n\n hasFileExtension = _lbryUri$parseModifie.hasFileExtension;\n } catch (error) {\n return res.status(400).json({ success: false, message: error.message });\n }\n var responseType = determineResponseType(hasFileExtension, headers);\n if (responseType !== SERVE) {\n return handleShowRender(req, res);\n }\n // handle serve request\n // send google analytics\n sendGAServeEvent(headers, ip, originalUrl);\n // parse the claim\n var claimName = void 0;\n try {\n var _lbryUri$parseClaim = lbryUri.parseClaim(params.claim);\n\n claimName = _lbryUri$parseClaim.claimName;\n } catch (error) {\n return res.status(400).json({ success: false, message: error.message });\n }\n // parse the identifier\n var isChannel = void 0,\n channelName = void 0,\n channelClaimId = void 0,\n claimId = void 0;\n try {\n var _lbryUri$parseIdentif = lbryUri.parseIdentifier(params.identifier);\n\n isChannel = _lbryUri$parseIdentif.isChannel;\n channelName = _lbryUri$parseIdentif.channelName;\n channelClaimId = _lbryUri$parseIdentif.channelClaimId;\n claimId = _lbryUri$parseIdentif.claimId;\n } catch (error) {\n return res.status(400).json({ success: false, message: error.message });\n }\n if (!isChannel) {\n var _flipClaimNameAndIdFo = flipClaimNameAndIdForBackwardsCompatibility(claimId, claimName);\n\n var _flipClaimNameAndIdFo2 = _slicedToArray(_flipClaimNameAndIdFo, 2);\n\n claimId = _flipClaimNameAndIdFo2[0];\n claimName = _flipClaimNameAndIdFo2[1];\n }\n // log the request data for debugging\n logRequestData(responseType, claimName, channelName, claimId);\n // get the claim Id and then serve the asset\n getClaimIdAndServeAsset(channelName, channelClaimId, claimName, claimId, originalUrl, ip, res);\n });\n // route to serve the winning asset at a claim or a channel page\n app.get('/:claim', function (req, res) {\n var headers = req.headers,\n ip = req.ip,\n originalUrl = req.originalUrl,\n params = req.params;\n // decide if this is a show request\n\n var hasFileExtension = void 0;\n try {\n var _lbryUri$parseModifie2 = lbryUri.parseModifier(params.claim);\n\n hasFileExtension = _lbryUri$parseModifie2.hasFileExtension;\n } catch (error) {\n return res.status(400).json({ success: false, message: error.message });\n }\n var responseType = determineResponseType(hasFileExtension, headers);\n if (responseType !== SERVE) {\n return handleShowRender(req, res);\n }\n // handle serve request\n // send google analytics\n sendGAServeEvent(headers, ip, originalUrl);\n // parse the claim\n var claimName = void 0;\n try {\n var _lbryUri$parseClaim2 = lbryUri.parseClaim(params.claim);\n\n claimName = _lbryUri$parseClaim2.claimName;\n } catch (error) {\n return res.status(400).json({ success: false, message: error.message });\n }\n // log the request data for debugging\n logRequestData(responseType, claimName, null, null);\n // get the claim Id and then serve the asset\n getClaimIdAndServeAsset(null, null, claimName, null, originalUrl, ip, res);\n });\n};\n\n/***/ }),\n/* 138 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar logger = __webpack_require__(2);\n\nvar _require = __webpack_require__(27),\n getClaimId = _require.getClaimId,\n getLocalFileRecord = _require.getLocalFileRecord;\n\nvar _require2 = __webpack_require__(26),\n handleErrorResponse = _require2.handleErrorResponse;\n\nvar SERVE = 'SERVE';\nvar SHOW = 'SHOW';\nvar NO_FILE = 'NO_FILE';\nvar NO_CHANNEL = 'NO_CHANNEL';\nvar NO_CLAIM = 'NO_CLAIM';\n\nfunction clientAcceptsHtml(_ref) {\n var accept = _ref.accept;\n\n return accept && accept.match(/text\\/html/);\n};\n\nfunction requestIsFromBrowser(headers) {\n return headers['user-agent'] && headers['user-agent'].match(/Mozilla/);\n};\n\nfunction clientWantsAsset(_ref2) {\n var accept = _ref2.accept,\n range = _ref2.range;\n\n var imageIsWanted = accept && accept.match(/image\\/.*/) && !accept.match(/text\\/html/) && !accept.match(/text\\/\\*/);\n var videoIsWanted = accept && range;\n return imageIsWanted || videoIsWanted;\n};\n\nfunction isValidClaimId(claimId) {\n return claimId.length === 40 && !/[^A-Za-z0-9]/g.test(claimId);\n};\n\nfunction isValidShortId(claimId) {\n return claimId.length === 1; // it should really evaluate the short url itself\n};\n\nfunction isValidShortIdOrClaimId(input) {\n return isValidClaimId(input) || isValidShortId(input);\n};\n\nfunction serveAssetToClient(claimId, name, res) {\n return getLocalFileRecord(claimId, name).then(function (fileRecord) {\n // check that a local record was found\n if (fileRecord === NO_FILE) {\n return res.status(307).redirect('/api/claim/get/' + name + '/' + claimId);\n }\n // serve the file\n var filePath = fileRecord.filePath,\n fileType = fileRecord.fileType;\n\n logger.verbose('serving file: ' + filePath);\n var sendFileOptions = {\n headers: {\n 'X-Content-Type-Options': 'nosniff',\n 'Content-Type': fileType || 'image/jpeg'\n }\n };\n res.status(200).sendFile(filePath, sendFileOptions);\n }).catch(function (error) {\n throw error;\n });\n};\n\nmodule.exports = {\n getClaimIdAndServeAsset: function getClaimIdAndServeAsset(channelName, channelClaimId, claimName, claimId, originalUrl, ip, res) {\n // get the claim Id and then serve the asset\n getClaimId(channelName, channelClaimId, claimName, claimId).then(function (fullClaimId) {\n if (fullClaimId === NO_CLAIM) {\n return res.status(404).json({ success: false, message: 'no claim id could be found' });\n } else if (fullClaimId === NO_CHANNEL) {\n return res.status(404).json({ success: false, message: 'no channel id could be found' });\n }\n serveAssetToClient(fullClaimId, claimName, res);\n // postToStats(responseType, originalUrl, ip, claimName, fullClaimId, 'success');\n }).catch(function (error) {\n handleErrorResponse(originalUrl, ip, error, res);\n // postToStats(responseType, originalUrl, ip, claimName, fullClaimId, 'fail');\n });\n },\n determineResponseType: function determineResponseType(hasFileExtension, headers) {\n var responseType = void 0;\n if (hasFileExtension) {\n responseType = SERVE; // assume a serve request if file extension is present\n if (clientAcceptsHtml(headers)) {\n // if the request comes from a browser, change it to a show request\n responseType = SHOW;\n }\n } else {\n responseType = SHOW;\n if (clientWantsAsset(headers) && requestIsFromBrowser(headers)) {\n // this is in case someone embeds a show url\n logger.debug('Show request came from browser but wants an image/video. Changing response to serve...');\n responseType = SERVE;\n }\n }\n return responseType;\n },\n flipClaimNameAndIdForBackwardsCompatibility: function flipClaimNameAndIdForBackwardsCompatibility(identifier, name) {\n // this is a patch for backwards compatability with '/name/claim_id' url format\n if (isValidShortIdOrClaimId(name) && !isValidShortIdOrClaimId(identifier)) {\n var tempName = name;\n name = identifier;\n identifier = tempName;\n }\n return [identifier, name];\n },\n logRequestData: function logRequestData(responseType, claimName, channelName, claimId) {\n logger.debug('responseType ===', responseType);\n logger.debug('claim name === ', claimName);\n logger.debug('channel name ===', channelName);\n logger.debug('claim id ===', claimId);\n }\n};\n\n/***/ }),\n/* 139 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar logger = __webpack_require__(2);\n\nmodule.exports = {\n REGEXP_INVALID_CLAIM: /[^A-Za-z0-9-]/g,\n REGEXP_INVALID_CHANNEL: /[^A-Za-z0-9-@]/g,\n REGEXP_ADDRESS: /^b(?=[^0OIl]{32,33})[0-9A-Za-z]{32,33}$/,\n CHANNEL_CHAR: '@',\n parseIdentifier: function parseIdentifier(identifier) {\n logger.debug('parsing identifier:', identifier);\n var componentsRegex = new RegExp('([^:$#/]*)' + // value (stops at the first separator or end)\n '([:$#]?)([^/]*)' // modifier separator, modifier (stops at the first path separator or end)\n );\n\n var _componentsRegex$exec = componentsRegex.exec(identifier).map(function (match) {\n return match || null;\n }),\n _componentsRegex$exec2 = _slicedToArray(_componentsRegex$exec, 4),\n proto = _componentsRegex$exec2[0],\n value = _componentsRegex$exec2[1],\n modifierSeperator = _componentsRegex$exec2[2],\n modifier = _componentsRegex$exec2[3];\n\n logger.debug(proto + ', ' + value + ', ' + modifierSeperator + ', ' + modifier);\n\n // Validate and process name\n if (!value) {\n throw new Error('Check your url. No channel name provided before \"' + modifierSeperator + '\"');\n }\n var isChannel = value.startsWith(module.exports.CHANNEL_CHAR);\n var channelName = isChannel ? value : null;\n var claimId = void 0;\n if (isChannel) {\n if (!channelName) {\n throw new Error('No channel name after @.');\n }\n var nameBadChars = channelName.match(module.exports.REGEXP_INVALID_CHANNEL);\n if (nameBadChars) {\n throw new Error('Invalid characters in channel name: ' + nameBadChars.join(', ') + '.');\n }\n } else {\n claimId = value;\n }\n\n // Validate and process modifier\n var channelClaimId = void 0;\n if (modifierSeperator) {\n if (!modifier) {\n throw new Error('No modifier provided after separator \"' + modifierSeperator + '\"');\n }\n\n if (modifierSeperator === ':') {\n channelClaimId = modifier;\n } else {\n throw new Error('The \"' + modifierSeperator + '\" modifier is not currently supported');\n }\n }\n return {\n isChannel: isChannel,\n channelName: channelName,\n channelClaimId: channelClaimId,\n claimId: claimId\n };\n },\n parseClaim: function parseClaim(claim) {\n logger.debug('parsing name:', claim);\n var componentsRegex = new RegExp('([^:$#/.]*)' + // name (stops at the first modifier)\n '([:$#.]?)([^/]*)' // modifier separator, modifier (stops at the first path separator or end)\n );\n\n var _componentsRegex$exec3 = componentsRegex.exec(claim).map(function (match) {\n return match || null;\n }),\n _componentsRegex$exec4 = _slicedToArray(_componentsRegex$exec3, 4),\n proto = _componentsRegex$exec4[0],\n claimName = _componentsRegex$exec4[1],\n modifierSeperator = _componentsRegex$exec4[2],\n modifier = _componentsRegex$exec4[3];\n\n logger.debug(proto + ', ' + claimName + ', ' + modifierSeperator + ', ' + modifier);\n\n // Validate and process name\n if (!claimName) {\n throw new Error('No claim name provided before .');\n }\n var nameBadChars = claimName.match(module.exports.REGEXP_INVALID_CLAIM);\n if (nameBadChars) {\n throw new Error('Invalid characters in claim name: ' + nameBadChars.join(', ') + '.');\n }\n // Validate and process modifier\n if (modifierSeperator) {\n if (!modifier) {\n throw new Error('No file extension provided after separator ' + modifierSeperator + '.');\n }\n if (modifierSeperator !== '.') {\n throw new Error('The ' + modifierSeperator + ' modifier is not supported in the claim name');\n }\n }\n // return results\n return {\n claimName: claimName\n };\n },\n parseModifier: function parseModifier(claim) {\n logger.debug('parsing modifier:', claim);\n var componentsRegex = new RegExp('([^:$#/.]*)' + // name (stops at the first modifier)\n '([:$#.]?)([^/]*)' // modifier separator, modifier (stops at the first path separator or end)\n );\n\n var _componentsRegex$exec5 = componentsRegex.exec(claim).map(function (match) {\n return match || null;\n }),\n _componentsRegex$exec6 = _slicedToArray(_componentsRegex$exec5, 4),\n proto = _componentsRegex$exec6[0],\n claimName = _componentsRegex$exec6[1],\n modifierSeperator = _componentsRegex$exec6[2],\n modifier = _componentsRegex$exec6[3];\n\n logger.debug(proto + ', ' + claimName + ', ' + modifierSeperator + ', ' + modifier);\n // Validate and process modifier\n var hasFileExtension = false;\n if (modifierSeperator) {\n hasFileExtension = true;\n }\n return {\n hasFileExtension: hasFileExtension\n };\n }\n};\n\n/***/ }),\n/* 140 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _server = __webpack_require__(29);\n\nvar _redux = __webpack_require__(18);\n\nvar _reducers = __webpack_require__(30);\n\nvar _reducers2 = _interopRequireDefault(_reducers);\n\nvar _reactRedux = __webpack_require__(1);\n\nvar _reactRouterDom = __webpack_require__(4);\n\nvar _GAListener = __webpack_require__(35);\n\nvar _GAListener2 = _interopRequireDefault(_GAListener);\n\nvar _app = __webpack_require__(36);\n\nvar _app2 = _interopRequireDefault(_app);\n\nvar _renderFullPage = __webpack_require__(42);\n\nvar _renderFullPage2 = _interopRequireDefault(_renderFullPage);\n\nvar _reduxSaga = __webpack_require__(141);\n\nvar _reduxSaga2 = _interopRequireDefault(_reduxSaga);\n\nvar _effects = __webpack_require__(15);\n\nvar _show_uri = __webpack_require__(142);\n\nvar _show = __webpack_require__(8);\n\nvar _reactHelmet = __webpack_require__(14);\n\nvar _reactHelmet2 = _interopRequireDefault(_reactHelmet);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar returnSagaWithParams = function returnSagaWithParams(saga, params) {\n return (/*#__PURE__*/regeneratorRuntime.mark(function _callee() {\n return regeneratorRuntime.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n _context.next = 2;\n return (0, _effects.call)(saga, params);\n\n case 2:\n case 'end':\n return _context.stop();\n }\n }\n }, _callee, this);\n })\n );\n};\n\nmodule.exports = function (req, res) {\n var context = {};\n\n // create and apply middleware\n var sagaMiddleware = (0, _reduxSaga2.default)();\n var middleware = (0, _redux.applyMiddleware)(sagaMiddleware);\n\n // create a new Redux store instance\n var store = (0, _redux.createStore)(_reducers2.default, middleware);\n\n // create saga\n var action = (0, _show.onHandleShowPageUri)(req.params);\n var saga = returnSagaWithParams(_show_uri.handleShowPageUri, action);\n\n // run the saga middleware\n sagaMiddleware.run(saga).done.then(function () {\n // render component to a string\n var html = (0, _server.renderToString)(_react2.default.createElement(\n _reactRedux.Provider,\n { store: store },\n _react2.default.createElement(\n _reactRouterDom.StaticRouter,\n { location: req.url, context: context },\n _react2.default.createElement(\n _GAListener2.default,\n null,\n _react2.default.createElement(_app2.default, null)\n )\n )\n ));\n\n // get head tags from helmet\n var helmet = _reactHelmet2.default.renderStatic();\n\n // check for a redirect\n if (context.url) {\n return res.redirect(301, context.url);\n }\n\n // get the initial state from our Redux store\n var preloadedState = store.getState();\n\n // send the rendered page back to the client\n res.send((0, _renderFullPage2.default)(helmet, html, preloadedState));\n });\n};\n\n/***/ }),\n/* 141 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"redux-saga\");\n\n/***/ }),\n/* 142 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.handleShowPageUri = handleShowPageUri;\nexports.watchHandleShowPageUri = watchHandleShowPageUri;\n\nvar _effects = __webpack_require__(15);\n\nvar _show_action_types = __webpack_require__(12);\n\nvar actions = _interopRequireWildcard(_show_action_types);\n\nvar _show = __webpack_require__(8);\n\nvar _show_asset = __webpack_require__(143);\n\nvar _show_channel = __webpack_require__(145);\n\nvar _lbryUri = __webpack_require__(147);\n\nvar _lbryUri2 = _interopRequireDefault(_lbryUri);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nvar _marked = /*#__PURE__*/regeneratorRuntime.mark(parseAndUpdateIdentifierAndClaim),\n _marked2 = /*#__PURE__*/regeneratorRuntime.mark(parseAndUpdateClaimOnly),\n _marked3 = /*#__PURE__*/regeneratorRuntime.mark(handleShowPageUri),\n _marked4 = /*#__PURE__*/regeneratorRuntime.mark(watchHandleShowPageUri);\n\nfunction parseAndUpdateIdentifierAndClaim(modifier, claim) {\n var isChannel, channelName, channelClaimId, claimId, claimName, extension, _lbryUri$parseIdentif, _lbryUri$parseClaim;\n\n return regeneratorRuntime.wrap(function parseAndUpdateIdentifierAndClaim$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n // this is a request for an asset\n // claim will be an asset claim\n // the identifier could be a channel or a claim id\n isChannel = void 0, channelName = void 0, channelClaimId = void 0, claimId = void 0, claimName = void 0, extension = void 0;\n _context.prev = 1;\n _lbryUri$parseIdentif = _lbryUri2.default.parseIdentifier(modifier);\n isChannel = _lbryUri$parseIdentif.isChannel;\n channelName = _lbryUri$parseIdentif.channelName;\n channelClaimId = _lbryUri$parseIdentif.channelClaimId;\n claimId = _lbryUri$parseIdentif.claimId;\n _lbryUri$parseClaim = _lbryUri2.default.parseClaim(claim);\n claimName = _lbryUri$parseClaim.claimName;\n extension = _lbryUri$parseClaim.extension;\n _context.next = 17;\n break;\n\n case 12:\n _context.prev = 12;\n _context.t0 = _context['catch'](1);\n _context.next = 16;\n return (0, _effects.put)((0, _show.onRequestError)(_context.t0.message));\n\n case 16:\n return _context.abrupt('return', _context.sent);\n\n case 17:\n if (!isChannel) {\n _context.next = 21;\n break;\n }\n\n _context.next = 20;\n return (0, _effects.call)(_show_asset.newAssetRequest, (0, _show.onNewAssetRequest)(claimName, null, channelName, channelClaimId, extension));\n\n case 20:\n return _context.abrupt('return', _context.sent);\n\n case 21:\n ;\n _context.next = 24;\n return (0, _effects.call)(_show_asset.newAssetRequest, (0, _show.onNewAssetRequest)(claimName, claimId, null, null, extension));\n\n case 24:\n case 'end':\n return _context.stop();\n }\n }\n }, _marked, this, [[1, 12]]);\n}\nfunction parseAndUpdateClaimOnly(claim) {\n var isChannel, channelName, channelClaimId, _lbryUri$parseIdentif2, claimName, extension, _lbryUri$parseClaim2;\n\n return regeneratorRuntime.wrap(function parseAndUpdateClaimOnly$(_context2) {\n while (1) {\n switch (_context2.prev = _context2.next) {\n case 0:\n // this could be a request for an asset or a channel page\n // claim could be an asset claim or a channel claim\n isChannel = void 0, channelName = void 0, channelClaimId = void 0;\n _context2.prev = 1;\n _lbryUri$parseIdentif2 = _lbryUri2.default.parseIdentifier(claim);\n isChannel = _lbryUri$parseIdentif2.isChannel;\n channelName = _lbryUri$parseIdentif2.channelName;\n channelClaimId = _lbryUri$parseIdentif2.channelClaimId;\n _context2.next = 13;\n break;\n\n case 8:\n _context2.prev = 8;\n _context2.t0 = _context2['catch'](1);\n _context2.next = 12;\n return (0, _effects.put)((0, _show.onRequestError)(_context2.t0.message));\n\n case 12:\n return _context2.abrupt('return', _context2.sent);\n\n case 13:\n if (!isChannel) {\n _context2.next = 17;\n break;\n }\n\n _context2.next = 16;\n return (0, _effects.call)(_show_channel.newChannelRequest, (0, _show.onNewChannelRequest)(channelName, channelClaimId));\n\n case 16:\n return _context2.abrupt('return', _context2.sent);\n\n case 17:\n // if not for a channel, parse the claim request\n claimName = void 0, extension = void 0;\n _context2.prev = 18;\n _lbryUri$parseClaim2 = _lbryUri2.default.parseClaim(claim);\n claimName = _lbryUri$parseClaim2.claimName;\n extension = _lbryUri$parseClaim2.extension;\n _context2.next = 29;\n break;\n\n case 24:\n _context2.prev = 24;\n _context2.t1 = _context2['catch'](18);\n _context2.next = 28;\n return (0, _effects.put)((0, _show.onRequestError)(_context2.t1.message));\n\n case 28:\n return _context2.abrupt('return', _context2.sent);\n\n case 29:\n _context2.next = 31;\n return (0, _effects.call)(_show_asset.newAssetRequest, (0, _show.onNewAssetRequest)(claimName, null, null, null, extension));\n\n case 31:\n case 'end':\n return _context2.stop();\n }\n }\n }, _marked2, this, [[1, 8], [18, 24]]);\n}\n\nfunction handleShowPageUri(action) {\n var _action$data, identifier, claim;\n\n return regeneratorRuntime.wrap(function handleShowPageUri$(_context3) {\n while (1) {\n switch (_context3.prev = _context3.next) {\n case 0:\n _action$data = action.data, identifier = _action$data.identifier, claim = _action$data.claim;\n\n if (!identifier) {\n _context3.next = 5;\n break;\n }\n\n _context3.next = 4;\n return (0, _effects.call)(parseAndUpdateIdentifierAndClaim, identifier, claim);\n\n case 4:\n return _context3.abrupt('return', _context3.sent);\n\n case 5:\n _context3.next = 7;\n return (0, _effects.call)(parseAndUpdateClaimOnly, claim);\n\n case 7:\n case 'end':\n return _context3.stop();\n }\n }\n }, _marked3, this);\n};\n\nfunction watchHandleShowPageUri() {\n return regeneratorRuntime.wrap(function watchHandleShowPageUri$(_context4) {\n while (1) {\n switch (_context4.prev = _context4.next) {\n case 0:\n _context4.next = 2;\n return (0, _effects.takeLatest)(actions.HANDLE_SHOW_URI, handleShowPageUri);\n\n case 2:\n case 'end':\n return _context4.stop();\n }\n }\n }, _marked4, this);\n};\n\n/***/ }),\n/* 143 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.newAssetRequest = newAssetRequest;\nexports.watchNewAssetRequest = watchNewAssetRequest;\n\nvar _effects = __webpack_require__(15);\n\nvar _show_action_types = __webpack_require__(12);\n\nvar actions = _interopRequireWildcard(_show_action_types);\n\nvar _show = __webpack_require__(8);\n\nvar _assetApi = __webpack_require__(144);\n\nvar _show2 = __webpack_require__(13);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nvar _marked = /*#__PURE__*/regeneratorRuntime.mark(newAssetRequest),\n _marked2 = /*#__PURE__*/regeneratorRuntime.mark(watchNewAssetRequest);\n\nfunction newAssetRequest(action) {\n var _action$data, requestType, requestId, name, modifier, state, longId, _ref, assetKey, shortId, _ref2, claimData, _ref3;\n\n return regeneratorRuntime.wrap(function newAssetRequest$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n _action$data = action.data, requestType = _action$data.requestType, requestId = _action$data.requestId, name = _action$data.name, modifier = _action$data.modifier;\n // put an action to update the request in redux\n\n _context.next = 3;\n return (0, _effects.put)((0, _show.onRequestUpdate)(requestType, requestId));\n\n case 3:\n _context.next = 5;\n return (0, _effects.select)(_show2.selectShowState);\n\n case 5:\n state = _context.sent;\n\n if (!state.requestList[requestId]) {\n _context.next = 8;\n break;\n }\n\n return _context.abrupt('return', null);\n\n case 8:\n // get long id && add request to request list\n longId = void 0;\n _context.prev = 9;\n _context.next = 12;\n return (0, _effects.call)(_assetApi.getLongClaimId, name, modifier);\n\n case 12:\n _ref = _context.sent;\n longId = _ref.data;\n _context.next = 21;\n break;\n\n case 16:\n _context.prev = 16;\n _context.t0 = _context['catch'](9);\n _context.next = 20;\n return (0, _effects.put)((0, _show.onRequestError)(_context.t0.message));\n\n case 20:\n return _context.abrupt('return', _context.sent);\n\n case 21:\n assetKey = 'a#' + name + '#' + longId;\n _context.next = 24;\n return (0, _effects.put)((0, _show.addRequestToRequestList)(requestId, null, assetKey));\n\n case 24:\n if (!state.assetList[assetKey]) {\n _context.next = 26;\n break;\n }\n\n return _context.abrupt('return', null);\n\n case 26:\n // get short Id\n shortId = void 0;\n _context.prev = 27;\n _context.next = 30;\n return (0, _effects.call)(_assetApi.getShortId, name, longId);\n\n case 30:\n _ref2 = _context.sent;\n shortId = _ref2.data;\n _context.next = 39;\n break;\n\n case 34:\n _context.prev = 34;\n _context.t1 = _context['catch'](27);\n _context.next = 38;\n return (0, _effects.put)((0, _show.onRequestError)(_context.t1.message));\n\n case 38:\n return _context.abrupt('return', _context.sent);\n\n case 39:\n // get asset claim data\n claimData = void 0;\n _context.prev = 40;\n _context.next = 43;\n return (0, _effects.call)(_assetApi.getClaimData, name, longId);\n\n case 43:\n _ref3 = _context.sent;\n claimData = _ref3.data;\n _context.next = 52;\n break;\n\n case 47:\n _context.prev = 47;\n _context.t2 = _context['catch'](40);\n _context.next = 51;\n return (0, _effects.put)((0, _show.onRequestError)(_context.t2.message));\n\n case 51:\n return _context.abrupt('return', _context.sent);\n\n case 52:\n _context.next = 54;\n return (0, _effects.put)((0, _show.addAssetToAssetList)(assetKey, null, name, longId, shortId, claimData));\n\n case 54:\n _context.next = 56;\n return (0, _effects.put)((0, _show.onRequestError)(null));\n\n case 56:\n case 'end':\n return _context.stop();\n }\n }\n }, _marked, this, [[9, 16], [27, 34], [40, 47]]);\n};\n\nfunction watchNewAssetRequest() {\n return regeneratorRuntime.wrap(function watchNewAssetRequest$(_context2) {\n while (1) {\n switch (_context2.prev = _context2.next) {\n case 0:\n _context2.next = 2;\n return (0, _effects.takeLatest)(actions.ASSET_REQUEST_NEW, newAssetRequest);\n\n case 2:\n case 'end':\n return _context2.stop();\n }\n }\n }, _marked2, this);\n};\n\n/***/ }),\n/* 144 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.getLongClaimId = getLongClaimId;\nexports.getShortId = getShortId;\nexports.getClaimData = getClaimData;\n\nvar _request = __webpack_require__(11);\n\nvar _request2 = _interopRequireDefault(_request);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar _require = __webpack_require__(3),\n host = _require.site.host;\n\nfunction getLongClaimId(name, modifier) {\n var body = {};\n // create request params\n if (modifier) {\n if (modifier.id) {\n body['claimId'] = modifier.id;\n } else {\n body['channelName'] = modifier.channel.name;\n body['channelClaimId'] = modifier.channel.id;\n }\n }\n body['claimName'] = name;\n var params = {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body)\n };\n // create url\n var url = host + '/api/claim/long-id';\n // return the request promise\n return (0, _request2.default)(url, params);\n};\n\nfunction getShortId(name, claimId) {\n var url = host + '/api/claim/short-id/' + claimId + '/' + name;\n return (0, _request2.default)(url);\n};\n\nfunction getClaimData(name, claimId) {\n var url = host + '/api/claim/data/' + name + '/' + claimId;\n return (0, _request2.default)(url);\n};\n\n/***/ }),\n/* 145 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.newChannelRequest = newChannelRequest;\nexports.watchNewChannelRequest = watchNewChannelRequest;\nexports.watchUpdateChannelClaims = watchUpdateChannelClaims;\n\nvar _effects = __webpack_require__(15);\n\nvar _show_action_types = __webpack_require__(12);\n\nvar actions = _interopRequireWildcard(_show_action_types);\n\nvar _show = __webpack_require__(8);\n\nvar _channelApi = __webpack_require__(146);\n\nvar _show2 = __webpack_require__(13);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nvar _marked = /*#__PURE__*/regeneratorRuntime.mark(newChannelRequest),\n _marked2 = /*#__PURE__*/regeneratorRuntime.mark(watchNewChannelRequest),\n _marked3 = /*#__PURE__*/regeneratorRuntime.mark(getNewClaimsAndUpdateChannel),\n _marked4 = /*#__PURE__*/regeneratorRuntime.mark(watchUpdateChannelClaims);\n\nfunction newChannelRequest(action) {\n var _action$data, requestType, requestId, channelName, channelId, state, longId, shortId, _ref, _ref$data, channelKey, claimsData, _ref2;\n\n return regeneratorRuntime.wrap(function newChannelRequest$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n _action$data = action.data, requestType = _action$data.requestType, requestId = _action$data.requestId, channelName = _action$data.channelName, channelId = _action$data.channelId;\n // put an action to update the request in redux\n\n _context.next = 3;\n return (0, _effects.put)((0, _show.onRequestUpdate)(requestType, requestId));\n\n case 3:\n _context.next = 5;\n return (0, _effects.select)(_show2.selectShowState);\n\n case 5:\n state = _context.sent;\n\n if (!state.requestList[requestId]) {\n _context.next = 8;\n break;\n }\n\n return _context.abrupt('return', null);\n\n case 8:\n // get channel long id\n longId = void 0, shortId = void 0;\n _context.prev = 9;\n _context.next = 12;\n return (0, _effects.call)(_channelApi.getChannelData, channelName, channelId);\n\n case 12:\n _ref = _context.sent;\n _ref$data = _ref.data;\n longId = _ref$data.longChannelClaimId;\n shortId = _ref$data.shortChannelClaimId;\n _context.next = 23;\n break;\n\n case 18:\n _context.prev = 18;\n _context.t0 = _context['catch'](9);\n _context.next = 22;\n return (0, _effects.put)((0, _show.onRequestError)(_context.t0.message));\n\n case 22:\n return _context.abrupt('return', _context.sent);\n\n case 23:\n // store the request in the channel requests list\n channelKey = 'c#' + channelName + '#' + longId;\n _context.next = 26;\n return (0, _effects.put)((0, _show.addRequestToRequestList)(requestId, null, channelKey));\n\n case 26:\n if (!state.channelList[channelKey]) {\n _context.next = 28;\n break;\n }\n\n return _context.abrupt('return', null);\n\n case 28:\n // get channel claims data\n claimsData = void 0;\n _context.prev = 29;\n _context.next = 32;\n return (0, _effects.call)(_channelApi.getChannelClaims, channelName, longId, 1);\n\n case 32:\n _ref2 = _context.sent;\n claimsData = _ref2.data;\n _context.next = 41;\n break;\n\n case 36:\n _context.prev = 36;\n _context.t1 = _context['catch'](29);\n _context.next = 40;\n return (0, _effects.put)((0, _show.onRequestError)(_context.t1.message));\n\n case 40:\n return _context.abrupt('return', _context.sent);\n\n case 41:\n _context.next = 43;\n return (0, _effects.put)((0, _show.addNewChannelToChannelList)(channelKey, channelName, shortId, longId, claimsData));\n\n case 43:\n _context.next = 45;\n return (0, _effects.put)((0, _show.onRequestError)(null));\n\n case 45:\n case 'end':\n return _context.stop();\n }\n }\n }, _marked, this, [[9, 18], [29, 36]]);\n}\n\nfunction watchNewChannelRequest() {\n return regeneratorRuntime.wrap(function watchNewChannelRequest$(_context2) {\n while (1) {\n switch (_context2.prev = _context2.next) {\n case 0:\n _context2.next = 2;\n return (0, _effects.takeLatest)(actions.CHANNEL_REQUEST_NEW, newChannelRequest);\n\n case 2:\n case 'end':\n return _context2.stop();\n }\n }\n }, _marked2, this);\n};\n\nfunction getNewClaimsAndUpdateChannel(action) {\n var _action$data2, channelKey, name, longId, page, claimsData, _ref3;\n\n return regeneratorRuntime.wrap(function getNewClaimsAndUpdateChannel$(_context3) {\n while (1) {\n switch (_context3.prev = _context3.next) {\n case 0:\n _action$data2 = action.data, channelKey = _action$data2.channelKey, name = _action$data2.name, longId = _action$data2.longId, page = _action$data2.page;\n claimsData = void 0;\n _context3.prev = 2;\n _context3.next = 5;\n return (0, _effects.call)(_channelApi.getChannelClaims, name, longId, page);\n\n case 5:\n _ref3 = _context3.sent;\n claimsData = _ref3.data;\n _context3.next = 14;\n break;\n\n case 9:\n _context3.prev = 9;\n _context3.t0 = _context3['catch'](2);\n _context3.next = 13;\n return (0, _effects.put)((0, _show.onRequestError)(_context3.t0.message));\n\n case 13:\n return _context3.abrupt('return', _context3.sent);\n\n case 14:\n _context3.next = 16;\n return (0, _effects.put)((0, _show.updateChannelClaims)(channelKey, claimsData));\n\n case 16:\n case 'end':\n return _context3.stop();\n }\n }\n }, _marked3, this, [[2, 9]]);\n}\n\nfunction watchUpdateChannelClaims() {\n return regeneratorRuntime.wrap(function watchUpdateChannelClaims$(_context4) {\n while (1) {\n switch (_context4.prev = _context4.next) {\n case 0:\n _context4.next = 2;\n return (0, _effects.takeLatest)(actions.CHANNEL_CLAIMS_UPDATE_ASYNC, getNewClaimsAndUpdateChannel);\n\n case 2:\n case 'end':\n return _context4.stop();\n }\n }\n }, _marked4, this);\n}\n\n/***/ }),\n/* 146 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.getChannelData = getChannelData;\nexports.getChannelClaims = getChannelClaims;\n\nvar _request = __webpack_require__(11);\n\nvar _request2 = _interopRequireDefault(_request);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar _require = __webpack_require__(3),\n host = _require.site.host;\n\nfunction getChannelData(name, id) {\n if (!id) id = 'none';\n var url = host + '/api/channel/data/' + name + '/' + id;\n return (0, _request2.default)(url);\n};\n\nfunction getChannelClaims(name, longId, page) {\n if (!page) page = 1;\n var url = host + '/api/channel/claims/' + name + '/' + longId + '/' + page;\n return (0, _request2.default)(url);\n};\n\n/***/ }),\n/* 147 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nmodule.exports = {\n REGEXP_INVALID_CLAIM: /[^A-Za-z0-9-]/g,\n REGEXP_INVALID_CHANNEL: /[^A-Za-z0-9-@]/g,\n REGEXP_ADDRESS: /^b(?=[^0OIl]{32,33})[0-9A-Za-z]{32,33}$/,\n CHANNEL_CHAR: '@',\n parseIdentifier: function parseIdentifier(identifier) {\n var componentsRegex = new RegExp('([^:$#/]*)' + // value (stops at the first separator or end)\n '([:$#]?)([^/]*)' // modifier separator, modifier (stops at the first path separator or end)\n );\n\n var _componentsRegex$exec = componentsRegex // eslint-disable-line no-unused-vars\n .exec(identifier).map(function (match) {\n return match || null;\n }),\n _componentsRegex$exec2 = _slicedToArray(_componentsRegex$exec, 4),\n proto = _componentsRegex$exec2[0],\n value = _componentsRegex$exec2[1],\n modifierSeperator = _componentsRegex$exec2[2],\n modifier = _componentsRegex$exec2[3];\n\n // Validate and process name\n\n\n if (!value) {\n throw new Error('Check your URL. No channel name provided before \"' + modifierSeperator + '\"');\n }\n var isChannel = value.startsWith(module.exports.CHANNEL_CHAR);\n var channelName = isChannel ? value : null;\n var claimId = void 0;\n if (isChannel) {\n if (!channelName) {\n throw new Error('Check your URL. No channel name after \"@\".');\n }\n var nameBadChars = channelName.match(module.exports.REGEXP_INVALID_CHANNEL);\n if (nameBadChars) {\n throw new Error('Check your URL. Invalid characters in channel name: \"' + nameBadChars.join(', ') + '\".');\n }\n } else {\n claimId = value;\n }\n\n // Validate and process modifier\n var channelClaimId = void 0;\n if (modifierSeperator) {\n if (!modifier) {\n throw new Error('Check your URL. No modifier provided after separator \"' + modifierSeperator + '\"');\n }\n\n if (modifierSeperator === ':') {\n channelClaimId = modifier;\n } else {\n throw new Error('Check your URL. The \"' + modifierSeperator + '\" modifier is not currently supported');\n }\n }\n return {\n isChannel: isChannel,\n channelName: channelName,\n channelClaimId: channelClaimId || null,\n claimId: claimId || null\n };\n },\n parseClaim: function parseClaim(name) {\n var componentsRegex = new RegExp('([^:$#/.]*)' + // name (stops at the first extension)\n '([:$#.]?)([^/]*)' // extension separator, extension (stops at the first path separator or end)\n );\n\n var _componentsRegex$exec3 = componentsRegex // eslint-disable-line no-unused-vars\n .exec(name).map(function (match) {\n return match || null;\n }),\n _componentsRegex$exec4 = _slicedToArray(_componentsRegex$exec3, 4),\n proto = _componentsRegex$exec4[0],\n claimName = _componentsRegex$exec4[1],\n extensionSeperator = _componentsRegex$exec4[2],\n extension = _componentsRegex$exec4[3];\n\n // Validate and process name\n\n\n if (!claimName) {\n throw new Error('Check your URL. No claim name provided before \".\"');\n }\n var nameBadChars = claimName.match(module.exports.REGEXP_INVALID_CLAIM);\n if (nameBadChars) {\n throw new Error('Check your URL. Invalid characters in claim name: \"' + nameBadChars.join(', ') + '\".');\n }\n // Validate and process extension\n if (extensionSeperator) {\n if (!extension) {\n throw new Error('Check your URL. No file extension provided after separator \"' + extensionSeperator + '\".');\n }\n if (extensionSeperator !== '.') {\n throw new Error('Check your URL. The \"' + extensionSeperator + '\" separator is not supported in the claim name.');\n }\n }\n return {\n claimName: claimName,\n extension: extension || null\n };\n }\n};\n\n/***/ }),\n/* 148 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar handlePageRender = __webpack_require__(28);\n\nmodule.exports = function (app) {\n // a catch-all route if someone visits a page that does not exist\n app.use('*', function (req, res) {\n // send response\n handlePageRender(req, res);\n });\n};\n\n/***/ }),\n/* 149 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"http\");\n\n/***/ })\n/******/ ]);\n\n\n// WEBPACK FOOTER //\n// index.js"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 43);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 22756f5f5c2f4aa32e15","module.exports = require(\"react\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"react\"\n// module id = 0\n// module chunks = 0","module.exports = require(\"react-redux\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"react-redux\"\n// module id = 1\n// module chunks = 0","module.exports = require(\"winston\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"winston\"\n// module id = 2\n// module chunks = 0","module.exports = {\n analytics: {\n googleId: 'UA-60403362-6', // google id for analytics tracking; leave `null` if not applicable\n },\n logging: {\n logLevel : 'debug', // options: silly, debug, verbose, info\n slackWebHook : 'https://hooks.slack.com/services/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', // enter a webhook if you wish to push logs to slack; otherwise leave as `null`\n slackErrorChannel: null, // enter a slack channel (#example) for errors to be sent to; otherwise leave null\n slackInfoChannel : '#speech-dev1-errors', // enter a slack channel (#info) for info level logs to be sent to otherwise leave null\n },\n session: {\n sessionKey: 'nans$#kfjanwe234rydns', // enter a secret key to be used for session encryption\n },\n files: {\n uploadDirectory: '/home/lbry/Uploads', // enter file path to where uploads/publishes should be stored\n },\n site: {\n title : 'dev1.Spee.ch',\n name : 'dev1.Spee.ch',\n host : 'https://dev1.spee.ch',\n description: 'Open-source, decentralized image and video sharing.',\n },\n publish: {\n primaryClaimAddress : 'bDZ2wPwtULUGxT7GXuNLpQhXmdPRUTUkcL',\n additionalClaimAddresses: ['banpwixPosfVDWnGvXqU2af36Qpsd7buGd'],\n thumbnailChannel : '@dev1thumbs', // create a channel to use for thumbnail images\n thumbnailChannelId : 'aeb625ff6f66c3eeeb42885070f4e53876033626', // the channel_id (claim id) for the channel above\n },\n claim: {\n defaultTitle : 'dev1 Spee.ch',\n defaultThumbnail : 'https://spee.ch/assets/img/video_thumb_default.png',\n defaultDescription: 'Open-source, decentralized image and video sharing.',\n },\n testing: {\n testChannel : '@test', // a channel to make test publishes in\n testChannelId : '3b5bc6b6819172c6e2f3f90aa855b14a956b4a82', // the claim id for the test channel\n testChannelPassword: '1234', // password for the test channel\n },\n api: {\n apiHost: 'localhost',\n apiPort: '5279',\n },\n};\n\n\n\n// WEBPACK FOOTER //\n// ./config/speechConfig.js","module.exports = require(\"react-router-dom\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"react-router-dom\"\n// module id = 4\n// module chunks = 0","import * as actions from 'constants/publish_action_types';\n\n// export action creators\nexport function selectFile (file) {\n return {\n type: actions.FILE_SELECTED,\n data: file,\n };\n};\n\nexport function clearFile () {\n return {\n type: actions.FILE_CLEAR,\n };\n};\n\nexport function updateMetadata (name, value) {\n return {\n type: actions.METADATA_UPDATE,\n data: {\n name,\n value,\n },\n };\n};\n\nexport function updateClaim (value) {\n return {\n type: actions.CLAIM_UPDATE,\n data: value,\n };\n};\n\nexport function setPublishInChannel (channel) {\n return {\n type: actions.SET_PUBLISH_IN_CHANNEL,\n channel,\n };\n};\n\nexport function updatePublishStatus (status, message) {\n return {\n type: actions.PUBLISH_STATUS_UPDATE,\n data: {\n status,\n message,\n },\n };\n};\n\nexport function updateError (name, value) {\n return {\n type: actions.ERROR_UPDATE,\n data: {\n name,\n value,\n },\n };\n};\n\nexport function updateSelectedChannel (channelName) {\n return {\n type: actions.SELECTED_CHANNEL_UPDATE,\n data: channelName,\n };\n};\n\nexport function toggleMetadataInputs (showMetadataInputs) {\n return {\n type: actions.TOGGLE_METADATA_INPUTS,\n data: showMetadataInputs,\n };\n};\n\nexport function onNewThumbnail (file) {\n return {\n type: actions.THUMBNAIL_NEW,\n data: file,\n };\n};\n\nexport function startPublish (history) {\n return {\n type: actions.PUBLISH_START,\n data: { history },\n };\n}\n\n\n\n// WEBPACK FOOTER //\n// ./react/actions/publish.js","const Sequelize = require('sequelize');\nconst logger = require('winston');\n\nmodule.exports = (mysqlConfig) => {\n const { database, username, password } = mysqlConfig;\n const db = {};\n // set sequelize options\n const sequelize = new Sequelize(database, username, password, {\n host : 'localhost',\n dialect : 'mysql',\n dialectOptions: {decimalNumbers: true}, // fix to ensure DECIMAL will not be stored as a string\n logging : false,\n pool : {\n max : 5,\n min : 0,\n idle : 10000,\n acquire: 10000,\n },\n });\n\n // establish mysql connection\n sequelize\n .authenticate()\n .then(() => {\n logger.info('Sequelize has established mysql connection successfully.');\n })\n .catch(err => {\n logger.error('Sequelize was unable to connect to the database:', err);\n });\n\n // manually add each model to the db object\n const Certificate = require('./certificate.js');\n const Channel = require('./channel.js');\n const Claim = require('./claim.js');\n const File = require('./file.js');\n const Request = require('./request.js');\n const User = require('./user.js');\n db['Certificate'] = sequelize.import('Certificate', Certificate);\n db['Channel'] = sequelize.import('Channel', Channel);\n db['Claim'] = sequelize.import('Claim', Claim);\n db['File'] = sequelize.import('File', File);\n db['Request'] = sequelize.import('Request', Request);\n db['User'] = sequelize.import('User', User);\n\n // run model.association for each model in the db object that has an association\n Object.keys(db).forEach(modelName => {\n if (db[modelName].associate) {\n logger.info('Associating model:', modelName);\n db[modelName].associate(db);\n }\n });\n\n db.sequelize = sequelize;\n db.Sequelize = Sequelize;\n\n // add an 'upsert' method to the db object\n db.upsert = (Model, values, condition, tableName) => {\n return Model\n .findOne({\n where: condition,\n })\n .then(obj => {\n if (obj) { // update\n logger.debug(`updating record in db.${tableName}`);\n return obj.update(values);\n } else { // insert\n logger.debug(`creating record in db.${tableName}`);\n return Model.create(values);\n }\n })\n .catch(function (error) {\n logger.error(`${tableName}.upsert error`, error);\n throw error;\n });\n };\n\n return db;\n};\n\n\n\n// WEBPACK FOOTER //\n// ./models/index.js","import { connect } from 'react-redux';\nimport { updateLoggedInChannel } from 'actions/channel';\nimport View from './view';\nimport {updateSelectedChannel} from '../../actions/publish';\n\nconst mapStateToProps = ({ channel }) => {\n return {\n channelName : channel.loggedInChannel.name,\n channelShortId: channel.loggedInChannel.shortId,\n channelLongId : channel.loggedInChannel.longId,\n };\n};\n\nconst mapDispatchToProps = dispatch => {\n return {\n onChannelLogin: (name, shortId, longId) => {\n dispatch(updateLoggedInChannel(name, shortId, longId));\n dispatch(updateSelectedChannel(name));\n },\n onChannelLogout: () => {\n dispatch(updateLoggedInChannel(null, null, null));\n },\n };\n};\n\nexport default connect(mapStateToProps, mapDispatchToProps)(View);\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/NavBar/index.js","import * as actions from 'constants/show_action_types';\n\nimport { CHANNEL, ASSET_LITE, ASSET_DETAILS } from 'constants/show_request_types';\n\n// basic request parsing\nexport function onHandleShowPageUri (params) {\n return {\n type: actions.HANDLE_SHOW_URI,\n data: params,\n };\n};\n\nexport function onRequestError (error) {\n return {\n type: actions.REQUEST_ERROR,\n data: error,\n };\n};\n\nexport function onNewChannelRequest (channelName, channelId) {\n const requestType = CHANNEL;\n const requestId = `cr#${channelName}#${channelId}`;\n return {\n type: actions.CHANNEL_REQUEST_NEW,\n data: { requestType, requestId, channelName, channelId },\n };\n};\n\nexport function onNewAssetRequest (name, id, channelName, channelId, extension) {\n const requestType = extension ? ASSET_LITE : ASSET_DETAILS;\n const requestId = `ar#${name}#${id}#${channelName}#${channelId}`;\n return {\n type: actions.ASSET_REQUEST_NEW,\n data: {\n requestType,\n requestId,\n name,\n modifier: {\n id,\n channel: {\n name: channelName,\n id : channelId,\n },\n },\n },\n };\n};\n\nexport function onRequestUpdate (requestType, requestId) {\n return {\n type: actions.REQUEST_UPDATE,\n data: {\n requestType,\n requestId,\n },\n };\n};\n\nexport function addRequestToRequestList (id, error, key) {\n return {\n type: actions.REQUEST_LIST_ADD,\n data: { id, error, key },\n };\n};\n\n// asset actions\n\nexport function addAssetToAssetList (id, error, name, claimId, shortId, claimData) {\n return {\n type: actions.ASSET_ADD,\n data: { id, error, name, claimId, shortId, claimData },\n };\n}\n\n// channel actions\n\nexport function addNewChannelToChannelList (id, name, shortId, longId, claimsData) {\n return {\n type: actions.CHANNEL_ADD,\n data: { id, name, shortId, longId, claimsData },\n };\n};\n\nexport function onUpdateChannelClaims (channelKey, name, longId, page) {\n return {\n type: actions.CHANNEL_CLAIMS_UPDATE_ASYNC,\n data: {channelKey, name, longId, page},\n };\n};\n\nexport function updateChannelClaims (channelListId, claimsData) {\n return {\n type: actions.CHANNEL_CLAIMS_UPDATE_SUCCESS,\n data: {channelListId, claimsData},\n };\n};\n\n// display a file\n\nexport function fileRequested (name, claimId) {\n return {\n type: actions.FILE_REQUESTED,\n data: { name, claimId },\n };\n};\n\nexport function updateFileAvailability (status) {\n return {\n type: actions.FILE_AVAILABILITY_UPDATE,\n data: status,\n };\n};\n\nexport function updateDisplayAssetError (error) {\n return {\n type: actions.DISPLAY_ASSET_ERROR,\n data: error,\n };\n};\n\n\n\n// WEBPACK FOOTER //\n// ./react/actions/show.js","import React from 'react';\nimport Helmet from 'react-helmet';\nimport PropTypes from 'prop-types';\n\nimport { createPageTitle } from 'utils/pageTitle';\nimport { createMetaTags } from 'utils/metaTags';\nimport { createCanonicalLink } from 'utils/canonicalLink';\n\nclass SEO extends React.Component {\n render () {\n let { pageTitle, asset, channel, pageUri } = this.props;\n pageTitle = createPageTitle(pageTitle);\n const metaTags = createMetaTags(asset, channel);\n const canonicalLink = createCanonicalLink(asset, channel, pageUri);\n return (\n \n );\n }\n};\n\nSEO.propTypes = {\n pageTitle: PropTypes.string,\n pageUri : PropTypes.string,\n channel : PropTypes.object,\n asset : PropTypes.object,\n};\n\nexport default SEO;\n\n\n\n// WEBPACK FOOTER //\n// ./react/components/SEO/index.jsx","module.exports = require(\"prop-types\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"prop-types\"\n// module id = 10\n// module chunks = 0","import 'cross-fetch/polyfill';\n\n/**\n * Parses the JSON returned by a network request\n *\n * @param {object} response A response from a network request\n *\n * @return {object} The parsed JSON from the request\n */\nfunction parseJSON (response) {\n if (response.status === 204 || response.status === 205) {\n return null;\n }\n return response.json();\n}\n\n/**\n * Parses the status returned by a network request\n *\n * @param {object} response A response from a network request\n * @param {object} response The parsed JSON from the network request\n *\n * @return {object | undefined} Returns object with status and statusText, or undefined\n */\nfunction checkStatus (response, jsonResponse) {\n if (response.status >= 200 && response.status < 300) {\n return jsonResponse;\n }\n const error = new Error(jsonResponse.message);\n error.response = response;\n throw error;\n}\n\n/**\n * Requests a URL, returning a promise\n *\n * @param {string} url The URL we want to request\n * @param {object} [options] The options we want to pass to \"fetch\"\n *\n * @return {object} The response data\n */\n\nexport default function request (url, options) {\n return fetch(url, options)\n .then(response => {\n return Promise.all([response, parseJSON(response)]);\n })\n .then(([response, jsonResponse]) => {\n return checkStatus(response, jsonResponse);\n });\n}\n\n\n\n// WEBPACK FOOTER //\n// ./react/utils/request.js","// request actions\nexport const HANDLE_SHOW_URI = 'HANDLE_SHOW_URI';\nexport const REQUEST_ERROR = 'REQUEST_ERROR';\nexport const REQUEST_UPDATE = 'REQUEST_UPDATE';\nexport const ASSET_REQUEST_NEW = 'ASSET_REQUEST_NEW';\nexport const CHANNEL_REQUEST_NEW = 'CHANNEL_REQUEST_NEW';\nexport const REQUEST_LIST_ADD = 'REQUEST_LIST_ADD';\n\n// asset actions\nexport const ASSET_ADD = `ASSET_ADD`;\n\n// channel actions\nexport const CHANNEL_ADD = 'CHANNEL_ADD';\n\nexport const CHANNEL_CLAIMS_UPDATE_ASYNC = 'CHANNEL_CLAIMS_UPDATE_ASYNC';\nexport const CHANNEL_CLAIMS_UPDATE_SUCCESS = 'CHANNEL_CLAIMS_UPDATE_SUCCESS';\n\n// asset/file display actions\nexport const FILE_REQUESTED = 'FILE_REQUESTED';\nexport const FILE_AVAILABILITY_UPDATE = 'FILE_AVAILABILITY_UPDATE';\nexport const DISPLAY_ASSET_ERROR = 'DISPLAY_ASSET_ERROR';\n\n\n\n// WEBPACK FOOTER //\n// ./react/constants/show_action_types.js","export const selectAsset = (show) => {\n const request = show.requestList[show.request.id];\n const assetKey = request.key;\n return show.assetList[assetKey];\n};\n\nexport const selectShowState = (state) => {\n return state.show;\n};\n\n\n\n// WEBPACK FOOTER //\n// ./react/selectors/show.js","module.exports = require(\"react-helmet\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"react-helmet\"\n// module id = 14\n// module chunks = 0","module.exports = require(\"redux-saga/effects\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"redux-saga/effects\"\n// module id = 15\n// module chunks = 0","const axios = require('axios');\nconst logger = require('winston');\nconst config = require('../config/speechConfig.js');\nconst { apiHost, apiPort } = config.api;\nconst lbryApiUri = 'http://' + apiHost + ':' + apiPort;\nconst { chooseGaLbrynetPublishLabel, sendGATimingEvent } = require('./googleAnalytics.js');\n\nconst handleLbrynetResponse = ({ data }, resolve, reject) => {\n logger.debug('lbry api data:', data);\n if (data.result) {\n // check for an error\n if (data.result.error) {\n logger.debug('Lbrynet api error:', data.result.error);\n reject(new Error(data.result.error));\n return;\n };\n resolve(data.result);\n return;\n }\n // fallback in case it just timed out\n reject(JSON.stringify(data));\n};\n\nmodule.exports = {\n publishClaim (publishParams) {\n logger.debug(`lbryApi >> Publishing claim to \"${publishParams.name}\"`);\n const gaStartTime = Date.now();\n return new Promise((resolve, reject) => {\n axios\n .post(lbryApiUri, {\n method: 'publish',\n params: publishParams,\n })\n .then(response => {\n sendGATimingEvent('lbrynet', 'publish', chooseGaLbrynetPublishLabel(publishParams), gaStartTime, Date.now());\n handleLbrynetResponse(response, resolve, reject);\n })\n .catch(error => {\n reject(error);\n });\n });\n },\n getClaim (uri) {\n logger.debug(`lbryApi >> Getting Claim for \"${uri}\"`);\n const gaStartTime = Date.now();\n return new Promise((resolve, reject) => {\n axios\n .post(lbryApiUri, {\n method: 'get',\n params: { uri, timeout: 20 },\n })\n .then(response => {\n sendGATimingEvent('lbrynet', 'getClaim', 'GET', gaStartTime, Date.now());\n handleLbrynetResponse(response, resolve, reject);\n })\n .catch(error => {\n reject(error);\n });\n });\n },\n getClaimList (claimName) {\n logger.debug(`lbryApi >> Getting claim_list for \"${claimName}\"`);\n const gaStartTime = Date.now();\n return new Promise((resolve, reject) => {\n axios\n .post(lbryApiUri, {\n method: 'claim_list',\n params: { name: claimName },\n })\n .then(response => {\n sendGATimingEvent('lbrynet', 'getClaimList', 'CLAIM_LIST', gaStartTime, Date.now());\n handleLbrynetResponse(response, resolve, reject);\n })\n .catch(error => {\n reject(error);\n });\n });\n },\n resolveUri (uri) {\n logger.debug(`lbryApi >> Resolving URI for \"${uri}\"`);\n const gaStartTime = Date.now();\n return new Promise((resolve, reject) => {\n axios\n .post(lbryApiUri, {\n method: 'resolve',\n params: { uri },\n })\n .then(({ data }) => {\n sendGATimingEvent('lbrynet', 'resolveUri', 'RESOLVE', gaStartTime, Date.now());\n if (data.result[uri].error) { // check for errors\n reject(data.result[uri].error);\n } else { // if no errors, resolve\n resolve(data.result[uri]);\n }\n })\n .catch(error => {\n reject(error);\n });\n });\n },\n getDownloadDirectory () {\n logger.debug('lbryApi >> Retrieving the download directory path from lbry daemon...');\n const gaStartTime = Date.now();\n return new Promise((resolve, reject) => {\n axios\n .post(lbryApiUri, {\n method: 'settings_get',\n })\n .then(({ data }) => {\n sendGATimingEvent('lbrynet', 'getDownloadDirectory', 'SETTINGS_GET', gaStartTime, Date.now());\n if (data.result) {\n resolve(data.result.download_directory);\n } else {\n return new Error('Successfully connected to lbry daemon, but unable to retrieve the download directory.');\n }\n })\n .catch(error => {\n logger.error('Lbrynet Error:', error);\n resolve('/home/lbry/Downloads/');\n });\n });\n },\n createChannel (name) {\n logger.debug(`lbryApi >> Creating channel for ${name}...`);\n const gaStartTime = Date.now();\n return new Promise((resolve, reject) => {\n axios\n .post(lbryApiUri, {\n method: 'channel_new',\n params: {\n channel_name: name,\n amount : 0.1,\n },\n })\n .then(response => {\n sendGATimingEvent('lbrynet', 'createChannel', 'CHANNEL_NEW', gaStartTime, Date.now());\n handleLbrynetResponse(response, resolve, reject);\n })\n .catch(error => {\n reject(error);\n });\n });\n },\n};\n\n\n\n// WEBPACK FOOTER //\n// ./helpers/lbryApi.js","const logger = require('winston');\nconst ua = require('universal-analytics');\nconst { analytics : { googleId }, site: { name: siteName } } = require('../config/speechConfig.js');\n\nfunction createServeEventParams (headers, ip, originalUrl) {\n return {\n eventCategory : 'client requests',\n eventAction : 'serve request',\n eventLabel : originalUrl,\n ipOverride : ip,\n userAgentOverride: headers['user-agent'],\n };\n};\n\nfunction createPublishTimingEventParams (category, variable, label, startTime, endTime) {\n const duration = endTime - startTime;\n return {\n userTimingCategory : category,\n userTimingVariableName: variable,\n userTimingTime : duration,\n userTimingLabel : label,\n };\n};\n\nfunction sendGoogleAnalyticsEvent (ip, params) {\n const visitorId = ip.replace(/\\./g, '-');\n const visitor = ua(googleId, visitorId, { strictCidFormat: false, https: true });\n visitor.event(params, (err) => {\n if (err) {\n logger.error('Google Analytics Event Error >>', err);\n }\n });\n};\n\nfunction sendGoogleAnalyticsTiming (visitorId, params) {\n const visitor = ua(googleId, visitorId, { strictCidFormat: false, https: true });\n visitor.timing(params, (err) => {\n if (err) {\n logger.error('Google Analytics Event Error >>', err);\n }\n logger.debug(`Timing event successfully sent to google analytics`);\n });\n};\n\nmodule.exports = {\n sendGAServeEvent (headers, ip, originalUrl) {\n const params = createServeEventParams(headers, ip, originalUrl);\n sendGoogleAnalyticsEvent(ip, params);\n },\n sendGATimingEvent (category, variable, label, startTime, endTime) {\n const params = createPublishTimingEventParams(category, variable, label, startTime, endTime);\n sendGoogleAnalyticsTiming(siteName, params);\n },\n chooseGaLbrynetPublishLabel ({ channel_name: channelName, channel_id: channelId }) {\n return (channelName || channelId ? 'PUBLISH_IN_CHANNEL_CLAIM' : 'PUBLISH_ANONYMOUS_CLAIM');\n },\n};\n\n\n\n// WEBPACK FOOTER //\n// ./helpers/googleAnalytics.js","module.exports = require(\"redux\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"redux\"\n// module id = 18\n// module chunks = 0","import * as actions from 'constants/channel_action_types';\n\n// export action creators\n\nexport function updateLoggedInChannel (name, shortId, longId) {\n return {\n type: actions.CHANNEL_UPDATE,\n data: {\n name,\n shortId,\n longId,\n },\n };\n};\n\n\n\n// WEBPACK FOOTER //\n// ./react/actions/channel.js","import React from 'react';\nimport PropTypes from 'prop-types';\nimport ActiveStatusBar from 'components/ActiveStatusBar';\nimport InactiveStatusBar from 'components/InactiveStatusBar';\n\nclass ProgressBar extends React.Component {\n constructor (props) {\n super(props);\n this.state = {\n bars : [],\n index : 0,\n incrementer: 1,\n };\n this.createBars = this.createBars.bind(this);\n this.startProgressBar = this.startProgressBar.bind(this);\n this.updateProgressBar = this.updateProgressBar.bind(this);\n this.stopProgressBar = this.stopProgressBar.bind(this);\n }\n componentDidMount () {\n this.createBars();\n this.startProgressBar();\n }\n componentWillUnmount () {\n this.stopProgressBar();\n }\n createBars () {\n const bars = [];\n for (let i = 0; i <= this.props.size; i++) {\n bars.push({isActive: false});\n }\n this.setState({ bars });\n }\n startProgressBar () {\n this.updateInterval = setInterval(this.updateProgressBar.bind(this), 300);\n };\n updateProgressBar () {\n let index = this.state.index;\n let incrementer = this.state.incrementer;\n let bars = this.state.bars;\n // flip incrementer if necessary, to stay in bounds\n if ((index < 0) || (index > this.props.size)) {\n incrementer = incrementer * -1;\n index += incrementer;\n }\n // update the indexed bar\n if (incrementer > 0) {\n bars[index].isActive = true;\n } else {\n bars[index].isActive = false;\n };\n // increment index\n index += incrementer;\n // update state\n this.setState({\n bars,\n incrementer,\n index,\n });\n };\n stopProgressBar () {\n clearInterval(this.updateInterval);\n };\n render () {\n return (\n
\n {this.state.bars.map((bar, index) => bar.isActive ? : )}\n
\n );\n }\n};\n\nProgressBar.propTypes = {\n size: PropTypes.number.isRequired,\n};\n\nexport default ProgressBar;\n\n\n\n// WEBPACK FOOTER //\n// ./react/components/ProgressBar/index.jsx","import React from 'react';\nimport PropTypes from 'prop-types';\nimport NavBar from 'containers/NavBar';\n\nclass ErrorPage extends React.Component {\n render () {\n const { error } = this.props;\n return (\n
\n \n
\n

{error}

\n
\n
\n );\n }\n};\n\nErrorPage.propTypes = {\n error: PropTypes.string.isRequired,\n};\n\nexport default ErrorPage;\n\n\n\n// WEBPACK FOOTER //\n// ./react/components/ErrorPage/index.jsx","module.exports = require(\"passport\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"passport\"\n// module id = 22\n// module chunks = 0","module.exports = {\n returnShortId: function (claimsArray, longId) {\n let claimIndex;\n let shortId = longId.substring(0, 1); // default short id is the first letter\n let shortIdLength = 0;\n // find the index of this claim id\n claimIndex = claimsArray.findIndex(element => {\n return element.claimId === longId;\n });\n if (claimIndex < 0) {\n throw new Error('claim id not found in claims list');\n }\n // get an array of all claims with lower height\n let possibleMatches = claimsArray.slice(0, claimIndex);\n // remove certificates with the same prefixes until none are left.\n while (possibleMatches.length > 0) {\n shortIdLength += 1;\n shortId = longId.substring(0, shortIdLength);\n possibleMatches = possibleMatches.filter(element => {\n return (element.claimId && (element.claimId.substring(0, shortIdLength) === shortId));\n });\n }\n return shortId;\n },\n};\n\n\n\n// WEBPACK FOOTER //\n// ./helpers/sequelizeHelpers.js","module.exports = require(\"passport-local\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"passport-local\"\n// module id = 24\n// module chunks = 0","const logger = require('winston');\nconst fs = require('fs');\nconst { site, wallet, publish } = require('../config/speechConfig.js');\n\nmodule.exports = {\n parsePublishApiRequestBody ({name, nsfw, license, title, description, thumbnail}) {\n // validate name\n if (!name) {\n throw new Error('no name field found in request');\n }\n const invalidNameCharacters = /[^A-Za-z0-9,-]/.exec(name);\n if (invalidNameCharacters) {\n throw new Error('The claim name you provided is not allowed. Only the following characters are allowed: A-Z, a-z, 0-9, and \"-\"');\n }\n // optional parameters\n nsfw = (nsfw === 'true');\n license = license || null;\n title = title || null;\n description = description || null;\n thumbnail = thumbnail || null;\n // return results\n return {\n name,\n nsfw,\n license,\n title,\n description,\n thumbnail,\n };\n },\n parsePublishApiRequestFiles ({file, thumbnail}) {\n // make sure a file was provided\n if (!file) {\n throw new Error('no file with key of [file] found in request');\n }\n if (!file.path) {\n throw new Error('no file path found');\n }\n if (!file.type) {\n throw new Error('no file type found');\n }\n if (!file.size) {\n throw new Error('no file type found');\n }\n // validate the file name\n if (/'/.test(file.name)) {\n throw new Error('apostrophes are not allowed in the file name');\n }\n // validate the file\n module.exports.validateFileTypeAndSize(file);\n // return results\n return {\n fileName : file.name,\n filePath : file.path,\n fileType : file.type,\n thumbnailFileName: (thumbnail ? thumbnail.name : null),\n thumbnailFilePath: (thumbnail ? thumbnail.path : null),\n thumbnailFileType: (thumbnail ? thumbnail.type : null),\n };\n },\n validateFileTypeAndSize (file) {\n // check file type and size\n switch (file.type) {\n case 'image/jpeg':\n case 'image/jpg':\n case 'image/png':\n if (file.size > 10000000) {\n logger.debug('publish > file validation > .jpeg/.jpg/.png was too big');\n throw new Error('Sorry, images are limited to 10 megabytes.');\n }\n break;\n case 'image/gif':\n if (file.size > 50000000) {\n logger.debug('publish > file validation > .gif was too big');\n throw new Error('Sorry, .gifs are limited to 50 megabytes.');\n }\n break;\n case 'video/mp4':\n if (file.size > 50000000) {\n logger.debug('publish > file validation > .mp4 was too big');\n throw new Error('Sorry, videos are limited to 50 megabytes.');\n }\n break;\n default:\n logger.debug('publish > file validation > unrecognized file type');\n throw new Error('The ' + file.type + ' content type is not supported. Only, .jpeg, .png, .gif, and .mp4 files are currently supported.');\n }\n return file;\n },\n createBasicPublishParams (filePath, name, title, description, license, nsfw, thumbnail) {\n logger.debug(`Creating Publish Parameters`);\n // provide defaults for title\n if (title === null || title.trim() === '') {\n title = name;\n }\n // provide default for description\n if (description === null || description.trim() === '') {\n description = '';\n }\n // provide default for license\n if (license === null || license.trim() === '') {\n license = ' '; // default to empty string\n }\n // create the publish params\n const publishParams = {\n name,\n file_path: filePath,\n bid : 0.01,\n metadata : {\n description,\n title,\n author : site.title,\n language: 'en',\n license,\n nsfw,\n },\n claim_address: wallet.lbryClaimAddress,\n };\n // add thumbnail to channel if video\n if (thumbnail) {\n publishParams['metadata']['thumbnail'] = thumbnail;\n }\n return publishParams;\n },\n createThumbnailPublishParams (thumbnailFilePath, claimName, license, nsfw) {\n if (!thumbnailFilePath) {\n return;\n }\n logger.debug(`Creating Thumbnail Publish Parameters`);\n // create the publish params\n return {\n name : `${claimName}-thumb`,\n file_path: thumbnailFilePath,\n bid : 0.01,\n metadata : {\n title : `${claimName} thumbnail`,\n description: `a thumbnail for ${claimName}`,\n author : site.title,\n language : 'en',\n license,\n nsfw,\n },\n claim_address: wallet.lbryClaimAddress,\n channel_name : publish.thumbnailChannel,\n channel_id : publish.thumbnailChannelId,\n };\n },\n deleteTemporaryFile (filePath) {\n fs.unlink(filePath, err => {\n if (err) {\n logger.error(`error deleting temporary file ${filePath}`);\n throw err;\n }\n logger.debug(`successfully deleted ${filePath}`);\n });\n },\n addGetResultsToFileData (fileInfo, getResult) {\n fileInfo.fileName = getResult.file_name;\n fileInfo.filePath = getResult.download_path;\n return fileInfo;\n },\n createFileData ({ name, claimId, outpoint, height, address, nsfw, contentType }) {\n return {\n name,\n claimId,\n outpoint,\n height,\n address,\n fileName: '',\n filePath: '',\n fileType: contentType,\n nsfw,\n };\n },\n};\n\n\n\n// WEBPACK FOOTER //\n// ./helpers/publishHelpers.js","const logger = require('winston');\n\nmodule.exports = {\n handleErrorResponse: function (originalUrl, ip, error, res) {\n logger.error(`Error on ${originalUrl}`, module.exports.useObjectPropertiesIfNoKeys(error));\n const [status, message] = module.exports.returnErrorMessageAndStatus(error);\n res\n .status(status)\n .json(module.exports.createErrorResponsePayload(status, message));\n },\n returnErrorMessageAndStatus: function (error) {\n let status, message;\n // check for daemon being turned off\n if (error.code === 'ECONNREFUSED') {\n status = 503;\n message = 'Connection refused. The daemon may not be running.';\n // fallback for everything else\n } else {\n status = 400;\n if (error.message) {\n message = error.message;\n } else {\n message = error;\n };\n };\n return [status, message];\n },\n useObjectPropertiesIfNoKeys: function (err) {\n if (Object.keys(err).length === 0) {\n let newErrorObject = {};\n Object.getOwnPropertyNames(err).forEach((key) => {\n newErrorObject[key] = err[key];\n });\n return newErrorObject;\n }\n return err;\n },\n createErrorResponsePayload (status, message) {\n return {\n status,\n success: false,\n message,\n };\n },\n};\n\n\n\n// WEBPACK FOOTER //\n// ./helpers/errorHandlers.js","const db = require('../models');\nconst logger = require('winston');\nconst { returnPaginatedChannelClaims } = require('../helpers/channelPagination.js');\n\nconst NO_CHANNEL = 'NO_CHANNEL';\nconst NO_CLAIM = 'NO_CLAIM';\nconst NO_FILE = 'NO_FILE';\n\nmodule.exports = {\n getClaimId (channelName, channelClaimId, name, claimId) {\n if (channelName) {\n return module.exports.getClaimIdByChannel(channelName, channelClaimId, name);\n } else {\n return module.exports.getClaimIdByClaim(name, claimId);\n }\n },\n getClaimIdByClaim (claimName, claimId) {\n logger.debug(`getClaimIdByClaim(${claimName}, ${claimId})`);\n return new Promise((resolve, reject) => {\n db.Claim.getLongClaimId(claimName, claimId)\n .then(longClaimId => {\n if (!longClaimId) {\n resolve(NO_CLAIM);\n }\n resolve(longClaimId);\n })\n .catch(error => {\n reject(error);\n });\n });\n },\n getClaimIdByChannel (channelName, channelClaimId, claimName) {\n logger.debug(`getClaimIdByChannel(${channelName}, ${channelClaimId}, ${claimName})`);\n return new Promise((resolve, reject) => {\n db.Certificate.getLongChannelId(channelName, channelClaimId) // 1. get the long channel id\n .then(longChannelId => {\n if (!longChannelId) {\n return [null, null];\n }\n return Promise.all([longChannelId, db.Claim.getClaimIdByLongChannelId(longChannelId, claimName)]); // 2. get the long claim id\n })\n .then(([longChannelId, longClaimId]) => {\n if (!longChannelId) {\n return resolve(NO_CHANNEL);\n }\n if (!longClaimId) {\n return resolve(NO_CLAIM);\n }\n resolve(longClaimId);\n })\n .catch(error => {\n reject(error);\n });\n });\n },\n getChannelData (channelName, channelClaimId, page) {\n return new Promise((resolve, reject) => {\n // 1. get the long channel Id (make sure channel exists)\n db.Certificate.getLongChannelId(channelName, channelClaimId)\n .then(longChannelClaimId => {\n if (!longChannelClaimId) {\n return [null, null, null];\n }\n // 2. get the short ID and all claims for that channel\n return Promise.all([longChannelClaimId, db.Certificate.getShortChannelIdFromLongChannelId(longChannelClaimId, channelName)]);\n })\n .then(([longChannelClaimId, shortChannelClaimId]) => {\n if (!longChannelClaimId) {\n return resolve(NO_CHANNEL);\n }\n // 3. return all the channel information\n resolve({\n channelName,\n longChannelClaimId,\n shortChannelClaimId,\n });\n })\n .catch(error => {\n reject(error);\n });\n });\n },\n getChannelClaims (channelName, channelClaimId, page) {\n return new Promise((resolve, reject) => {\n // 1. get the long channel Id (make sure channel exists)\n db.Certificate.getLongChannelId(channelName, channelClaimId)\n .then(longChannelClaimId => {\n if (!longChannelClaimId) {\n return [null, null, null];\n }\n // 2. get the short ID and all claims for that channel\n return Promise.all([longChannelClaimId, db.Claim.getAllChannelClaims(longChannelClaimId)]);\n })\n .then(([longChannelClaimId, channelClaimsArray]) => {\n if (!longChannelClaimId) {\n return resolve(NO_CHANNEL);\n }\n // 3. format the data for the view, including pagination\n let paginatedChannelViewData = returnPaginatedChannelClaims(channelName, longChannelClaimId, channelClaimsArray, page);\n // 4. return all the channel information and contents\n resolve(paginatedChannelViewData);\n })\n .catch(error => {\n reject(error);\n });\n });\n },\n getLocalFileRecord (claimId, name) {\n return db.File.findOne({where: {claimId, name}})\n .then(file => {\n if (!file) {\n return NO_FILE;\n }\n return file.dataValues;\n });\n },\n};\n\n\n\n// WEBPACK FOOTER //\n// ./controllers/serveController.js","import React from 'react';\nimport { renderToString } from 'react-dom/server';\nimport { createStore } from 'redux';\nimport Reducer from '../react/reducers';\nimport { Provider } from 'react-redux';\nimport { StaticRouter } from 'react-router-dom';\nimport GAListener from '../react/components/GAListener';\nimport App from '../react/app';\nimport renderFullPage from './renderFullPage.js';\nimport Helmet from 'react-helmet';\n\nmodule.exports = (req, res) => {\n let context = {};\n\n // create a new Redux store instance\n const store = createStore(Reducer);\n\n // render component to a string\n const html = renderToString(\n \n \n \n \n \n \n \n );\n\n // get head tags from helmet\n const helmet = Helmet.renderStatic();\n\n // check for a redirect\n if (context.url) {\n // Somewhere a `` was rendered\n return res.redirect(301, context.url);\n } else {\n // we're good, send the response\n }\n\n // get the initial state from our Redux store\n const preloadedState = store.getState();\n\n // send the rendered page back to the client\n res.send(renderFullPage(helmet, html, preloadedState));\n};\n\n\n\n// WEBPACK FOOTER //\n// ./helpers/handlePageRender.jsx","module.exports = require(\"react-dom/server\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"react-dom/server\"\n// module id = 29\n// module chunks = 0","import { combineReducers } from 'redux';\nimport PublishReducer from 'reducers/publish';\nimport ChannelReducer from 'reducers/channel';\nimport ShowReducer from 'reducers/show';\nimport SiteReducer from 'reducers/site';\n\nexport default combineReducers({\n channel: ChannelReducer,\n publish: PublishReducer,\n show : ShowReducer,\n site : SiteReducer,\n});\n\n\n\n// WEBPACK FOOTER //\n// ./react/reducers/index.js","export const FILE_SELECTED = 'FILE_SELECTED';\nexport const FILE_CLEAR = 'FILE_CLEAR';\nexport const METADATA_UPDATE = 'METADATA_UPDATE';\nexport const CLAIM_UPDATE = 'CLAIM_UPDATE';\nexport const SET_PUBLISH_IN_CHANNEL = 'SET_PUBLISH_IN_CHANNEL';\nexport const PUBLISH_STATUS_UPDATE = 'PUBLISH_STATUS_UPDATE';\nexport const ERROR_UPDATE = 'ERROR_UPDATE';\nexport const SELECTED_CHANNEL_UPDATE = 'SELECTED_CHANNEL_UPDATE';\nexport const TOGGLE_METADATA_INPUTS = 'TOGGLE_METADATA_INPUTS';\nexport const THUMBNAIL_NEW = 'THUMBNAIL_NEW';\nexport const PUBLISH_START = 'PUBLISH_START';\n\n\n\n// WEBPACK FOOTER //\n// ./react/constants/publish_action_types.js","export const LOGIN = 'Existing';\nexport const CREATE = 'New';\n\n\n\n// WEBPACK FOOTER //\n// ./react/constants/publish_channel_select_states.js","export const CHANNEL_UPDATE = 'CHANNEL_UPDATE';\n\n\n\n// WEBPACK FOOTER //\n// ./react/constants/channel_action_types.js","export const LOCAL_CHECK = 'LOCAL_CHECK';\nexport const UNAVAILABLE = 'UNAVAILABLE';\nexport const ERROR = 'ERROR';\nexport const AVAILABLE = 'AVAILABLE';\n\n\n\n// WEBPACK FOOTER //\n// ./react/constants/asset_display_states.js","import React from 'react';\nimport GoogleAnalytics from 'react-ga';\nimport { withRouter } from 'react-router-dom';\nconst config = require('../../../config/speechConfig.js');\nconst googleApiKey = config.analytics.googleId;\n\nGoogleAnalytics.initialize(googleApiKey);\n\nclass GAListener extends React.Component {\n componentDidMount () {\n this.sendPageView(this.props.history.location);\n this.props.history.listen(this.sendPageView);\n }\n\n sendPageView (location) {\n GoogleAnalytics.set({ page: location.pathname });\n GoogleAnalytics.pageview(location.pathname);\n }\n\n render () {\n return this.props.children;\n }\n}\n\nexport default withRouter(GAListener);\n\n\n\n// WEBPACK FOOTER //\n// ./react/components/GAListener/index.jsx","import React from 'react';\nimport { Route, Switch } from 'react-router-dom';\nimport HomePage from 'components/HomePage';\nimport AboutPage from 'components/AboutPage';\nimport LoginPage from 'containers/LoginPage';\nimport ShowPage from 'containers/ShowPage';\nimport FourOhFourPage from 'components/FourOhFourPage';\n\nconst App = () => {\n return (\n \n \n \n \n \n \n \n \n );\n};\n\nexport default App;\n\n\n\n// WEBPACK FOOTER //\n// ./react/app.js","import { connect } from 'react-redux';\nimport { selectFile, updateError, clearFile } from 'actions/publish';\nimport View from './view';\n\nconst mapStateToProps = ({ publish }) => {\n return {\n file : publish.file,\n thumbnail: publish.thumbnail,\n fileError: publish.error.file,\n };\n};\n\nconst mapDispatchToProps = dispatch => {\n return {\n selectFile: (file) => {\n dispatch(selectFile(file));\n },\n setFileError: (value) => {\n dispatch(clearFile());\n dispatch(updateError('file', value));\n },\n };\n};\n\nexport default connect(mapStateToProps, mapDispatchToProps)(View);\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/Dropzone/index.js","import { connect } from 'react-redux';\nimport { updateLoggedInChannel } from 'actions/channel';\nimport View from './view';\nimport {updateSelectedChannel} from '../../actions/publish';\n\nconst mapDispatchToProps = dispatch => {\n return {\n onChannelLogin: (name, shortId, longId) => {\n dispatch(updateLoggedInChannel(name, shortId, longId));\n dispatch(updateSelectedChannel(name));\n },\n };\n};\n\nexport default connect(null, mapDispatchToProps)(View);\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/ChannelLoginForm/index.js","import { connect } from 'react-redux';\nimport { updateLoggedInChannel } from 'actions/channel';\nimport View from './view';\nimport {updateSelectedChannel} from 'actions/publish';\n\nconst mapDispatchToProps = dispatch => {\n return {\n onChannelLogin: (name, shortId, longId) => {\n dispatch(updateLoggedInChannel(name, shortId, longId));\n dispatch(updateSelectedChannel(name));\n },\n };\n};\n\nexport default connect(null, mapDispatchToProps)(View);\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/ChannelCreateForm/index.js","export const CHANNEL = 'CHANNEL';\nexport const ASSET_LITE = 'ASSET_LITE';\nexport const ASSET_DETAILS = 'ASSET_DETAILS';\n\n\n\n// WEBPACK FOOTER //\n// ./react/constants/show_request_types.js","import { connect } from 'react-redux';\nimport View from './view';\nimport { fileRequested } from 'actions/show';\nimport { selectAsset } from 'selectors/show';\n\nconst mapStateToProps = ({ show }) => {\n // select error and status\n const error = show.displayAsset.error;\n const status = show.displayAsset.status;\n // select asset\n const asset = selectAsset(show);\n // return props\n return {\n error,\n status,\n asset,\n };\n};\n\nconst mapDispatchToProps = dispatch => {\n return {\n onFileRequest: (name, claimId) => {\n dispatch(fileRequested(name, claimId));\n },\n };\n};\n\nexport default connect(mapStateToProps, mapDispatchToProps)(View);\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/AssetDisplay/index.js","module.exports = (helmet, html, preloadedState) => {\n // take the html and preloadedState and return the full page\n return `\n \n \n \n \n \n \n \n ${helmet.title.toString()}\n ${helmet.meta.toString()}\n ${helmet.link.toString()}\n \n \n \n \n \n \n \n \n
\n
${html}
\n
\n \n \n \n \n `;\n};\n\n\n\n// WEBPACK FOOTER //\n// ./helpers/renderFullPage.js","module.exports = require(\"babel-polyfill\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"babel-polyfill\"\n// module id = 44\n// module chunks = 0","module.exports = require(\"whatwg-fetch\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"whatwg-fetch\"\n// module id = 45\n// module chunks = 0","// load dependencies\nconst express = require('express');\nconst bodyParser = require('body-parser');\nconst expressHandlebars = require('express-handlebars');\nconst Handlebars = require('handlebars');\nconst { populateLocalsDotUser, serializeSpeechUser, deserializeSpeechUser } = require('./helpers/authHelpers.js');\nconst config = require('./config/speechConfig.js');\nconst logger = require('winston');\nconst helmet = require('helmet');\nconst PORT = 3000; // set port\nconst app = express(); // create an Express application\nconst passport = require('passport');\nconst cookieSession = require('cookie-session');\n\n// configure logging\nconst logLevel = config.logging.logLevel;\nrequire('./config/loggerConfig.js')(logger, logLevel);\nrequire('./config/slackConfig.js')(logger);\n\n// check for global config variables\nrequire('./helpers/configVarCheck.js')();\n\n// trust the proxy to get ip address for us\napp.enable('trust proxy');\n\n// add middleware\napp.use(helmet()); // set HTTP headers to protect against well-known web vulnerabilties\napp.use(express.static(`${__dirname}/public`)); // 'express.static' to serve static files from public directory\napp.use(bodyParser.json()); // 'body parser' for parsing application/json\napp.use(bodyParser.urlencoded({ extended: true })); // 'body parser' for parsing application/x-www-form-urlencoded\napp.use((req, res, next) => { // custom logging middleware to log all incoming http requests\n logger.verbose(`Request on ${req.originalUrl} from ${req.ip}`);\n next();\n});\n\n// configure passport\npassport.serializeUser(serializeSpeechUser);\npassport.deserializeUser(deserializeSpeechUser);\nconst localSignupStrategy = require('./passport/local-signup.js');\nconst localLoginStrategy = require('./passport/local-login.js');\npassport.use('local-signup', localSignupStrategy);\npassport.use('local-login', localLoginStrategy);\n// initialize passport\napp.use(cookieSession({\n name : 'session',\n keys : [config.session.sessionKey],\n maxAge: 24 * 60 * 60 * 1000, // 24 hours\n}));\napp.use(passport.initialize());\napp.use(passport.session());\n\n// configure handlebars & register it with express app\nconst hbs = expressHandlebars.create({\n defaultLayout: 'embed', // sets the default layout\n handlebars : Handlebars, // includes basic handlebars for access to that library\n});\napp.engine('handlebars', hbs.engine);\napp.set('view engine', 'handlebars');\n\n// middleware to pass user info back to client (for handlebars access), if user is logged in\napp.use(populateLocalsDotUser);\n\n// start the server\nconst startServer = (mysqlConfig) => {\n const db = require('./models')(mysqlConfig); // require our models for syncing\n db.sequelize\n // sync sequelize\n .sync()\n // require routes\n .then(() => {\n require('./routes/auth-routes.js')(app);\n require('./routes/api-routes.js')(app);\n require('./routes/page-routes.js')(app);\n require('./routes/serve-routes.js')(app);\n require('./routes/fallback-routes.js')(app);\n const http = require('http');\n return http.Server(app);\n })\n // start the server\n .then(server => {\n server.listen(PORT, () => {\n logger.info('Trusting proxy?', app.get('trust proxy'));\n logger.info(`Server is listening on PORT ${PORT}`);\n });\n })\n .catch((error) => {\n logger.error(`Startup Error:`, error);\n });\n};\n\nconst speech = {\n start (config) {\n const { mysqlConfig } = config;\n startServer(mysqlConfig);\n },\n};\n\nmodule.exports = speech;\n\n\n\n// WEBPACK FOOTER //\n// ./server.js","module.exports = require(\"express\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"express\"\n// module id = 47\n// module chunks = 0","module.exports = require(\"body-parser\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"body-parser\"\n// module id = 48\n// module chunks = 0","module.exports = require(\"express-handlebars\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"express-handlebars\"\n// module id = 49\n// module chunks = 0","module.exports = require(\"handlebars\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"handlebars\"\n// module id = 50\n// module chunks = 0","// const db = require('../models'); // require our models for syncing\nconst logger = require('winston');\n\nmodule.exports = {\n populateLocalsDotUser (req, res, next) {\n if (req.user) {\n logger.debug('populating res.locals.user');\n res.locals.user = {\n id : req.user.id,\n userName : req.user.userName,\n channelName : req.user.channelName,\n channelClaimId: req.user.channelClaimId,\n shortChannelId: req.user.shortChannelId,\n };\n }\n next();\n },\n serializeSpeechUser (user, done) { // returns user data to be serialized into session\n logger.debug('serializing user');\n done(null, user);\n },\n deserializeSpeechUser (user, done) { // deserializes session and populates additional info to req.user\n logger.debug('deserializing user');\n done(null, user);\n },\n};\n\n\n\n// WEBPACK FOOTER //\n// ./helpers/authHelpers.js","module.exports = require(\"helmet\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"helmet\"\n// module id = 52\n// module chunks = 0","module.exports = require(\"cookie-session\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"cookie-session\"\n// module id = 53\n// module chunks = 0","module.exports = (winston, logLevel) => {\n winston.configure({\n transports: [\n new (winston.transports.Console)({\n level : logLevel,\n timestamp : false,\n colorize : true,\n prettyPrint : true,\n handleExceptions : true,\n humanReadableUnhandledException: true,\n }),\n ],\n });\n\n winston.error('Level 0');\n winston.warn('Level 1');\n winston.info('Level 2');\n winston.verbose('Level 3');\n winston.debug('Level 4');\n winston.silly('Level 5');\n};\n\n\n\n// WEBPACK FOOTER //\n// ./config/loggerConfig.js","const { logging } = require('./speechConfig.js');\nconst { slackWebHook, slackErrorChannel, slackInfoChannel } = logging;\nconst winstonSlackWebHook = require('winston-slack-webhook').SlackWebHook;\n\nmodule.exports = (winston) => {\n if (slackWebHook) {\n // add a transport for errors to slack\n if (slackErrorChannel) {\n winston.add(winstonSlackWebHook, {\n name : 'slack-errors-transport',\n level : 'warn',\n webhookUrl: slackWebHook,\n channel : slackErrorChannel,\n username : 'spee.ch',\n iconEmoji : ':face_with_head_bandage:',\n });\n };\n if (slackInfoChannel) {\n winston.add(winstonSlackWebHook, {\n name : 'slack-info-transport',\n level : 'info',\n webhookUrl: slackWebHook,\n channel : slackInfoChannel,\n username : 'spee.ch',\n iconEmoji : ':nerd_face:',\n });\n };\n // send test message\n winston.error('Slack \"error\" logging is online.');\n winston.info('Slack \"info\" logging is online.');\n } else {\n winston.warn('Slack logging is not enabled because no slackWebHook config var provided.');\n }\n};\n\n\n\n// WEBPACK FOOTER //\n// ./config/slackConfig.js","module.exports = require(\"winston-slack-webhook\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"winston-slack-webhook\"\n// module id = 56\n// module chunks = 0","const config = require('../config/speechConfig.js');\nconst logger = require('winston');\n\nmodule.exports = function () {\n // get the config file\n\n for (let configCategoryKey in config) {\n if (config.hasOwnProperty(configCategoryKey)) {\n // get the final variables for each config category\n const configVariables = config[configCategoryKey];\n for (let configVarKey in configVariables) {\n if (configVariables.hasOwnProperty(configVarKey)) {\n // print each variable\n logger.debug(`CONFIG CHECK: ${configCategoryKey}.${configVarKey} === ${configVariables[configVarKey]}`);\n }\n }\n }\n }\n};\n\n\n\n// WEBPACK FOOTER //\n// ./helpers/configVarCheck.js","const db = require('../models');\nconst PassportLocalStrategy = require('passport-local').Strategy;\nconst lbryApi = require('../helpers/lbryApi.js');\nconst logger = require('winston');\n\nmodule.exports = new PassportLocalStrategy(\n {\n usernameField: 'username',\n passwordField: 'password',\n },\n (username, password, done) => {\n logger.verbose(`new channel signup request. user: ${username} pass: ${password} .`);\n let userInfo = {};\n // server-side validaton of inputs (username, password)\n\n // create the channel and retrieve the metadata\n return lbryApi.createChannel(`@${username}`)\n .then(tx => {\n // create user record\n const userData = {\n userName: username,\n password: password,\n };\n logger.verbose('userData >', userData);\n // create user record\n const channelData = {\n channelName : `@${username}`,\n channelClaimId: tx.claim_id,\n };\n logger.verbose('channelData >', channelData);\n // create certificate record\n const certificateData = {\n claimId: tx.claim_id,\n name : `@${username}`,\n // address,\n };\n logger.verbose('certificateData >', certificateData);\n // save user and certificate to db\n return Promise.all([db.User.create(userData), db.Channel.create(channelData), db.Certificate.create(certificateData)]);\n })\n .then(([newUser, newChannel, newCertificate]) => {\n logger.verbose('user and certificate successfully created');\n // store the relevant newUser info to be passed back for req.User\n userInfo['id'] = newUser.id;\n userInfo['userName'] = newUser.userName;\n userInfo['channelName'] = newChannel.channelName;\n userInfo['channelClaimId'] = newChannel.channelClaimId;\n // associate the instances\n return Promise.all([newCertificate.setChannel(newChannel), newChannel.setUser(newUser)]);\n })\n .then(() => {\n logger.verbose('user and certificate successfully associated');\n return db.Certificate.getShortChannelIdFromLongChannelId(userInfo.channelClaimId, userInfo.channelName);\n })\n .then(shortChannelId => {\n userInfo['shortChannelId'] = shortChannelId;\n return done(null, userInfo);\n })\n .catch(error => {\n logger.error('signup error', error);\n return done(error);\n });\n }\n);\n\n\n\n// WEBPACK FOOTER //\n// ./passport/local-signup.js","module.exports = require(\"sequelize\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"sequelize\"\n// module id = 59\n// module chunks = 0","const logger = require('winston');\nconst { returnShortId } = require('../helpers/sequelizeHelpers.js');\n\nmodule.exports = (sequelize, { STRING, BOOLEAN, INTEGER, TEXT, DECIMAL }) => {\n const Certificate = sequelize.define(\n 'Certificate',\n {\n address: {\n type : STRING,\n default: null,\n },\n amount: {\n type : DECIMAL(19, 8),\n default: null,\n },\n claimId: {\n type : STRING,\n default: null,\n },\n claimSequence: {\n type : INTEGER,\n default: null,\n },\n decodedClaim: {\n type : BOOLEAN,\n default: null,\n },\n depth: {\n type : INTEGER,\n default: null,\n },\n effectiveAmount: {\n type : DECIMAL(19, 8),\n default: null,\n },\n hasSignature: {\n type : BOOLEAN,\n default: null,\n },\n height: {\n type : INTEGER,\n default: null,\n },\n hex: {\n type : TEXT('long'),\n default: null,\n },\n name: {\n type : STRING,\n default: null,\n },\n nout: {\n type : INTEGER,\n default: null,\n },\n txid: {\n type : STRING,\n default: null,\n },\n validAtHeight: {\n type : INTEGER,\n default: null,\n },\n outpoint: {\n type : STRING,\n default: null,\n },\n valueVersion: {\n type : STRING,\n default: null,\n },\n claimType: {\n type : STRING,\n default: null,\n },\n certificateVersion: {\n type : STRING,\n default: null,\n },\n keyType: {\n type : STRING,\n default: null,\n },\n publicKey: {\n type : TEXT('long'),\n default: null,\n },\n },\n {\n freezeTableName: true,\n }\n );\n\n Certificate.associate = db => {\n Certificate.belongsTo(db.Channel, {\n foreignKey: {\n allowNull: true,\n },\n });\n };\n\n Certificate.getShortChannelIdFromLongChannelId = function (longChannelId, channelName) {\n logger.debug(`getShortChannelIdFromLongChannelId ${channelName}:${longChannelId}`);\n return new Promise((resolve, reject) => {\n this\n .findAll({\n where: {name: channelName},\n order: [['height', 'ASC']],\n })\n .then(result => {\n switch (result.length) {\n case 0:\n throw new Error('No channel(s) found with that channel name');\n default:\n return resolve(returnShortId(result, longChannelId));\n }\n })\n .catch(error => {\n reject(error);\n });\n });\n };\n\n Certificate.getLongChannelIdFromShortChannelId = function (channelName, channelClaimId) {\n logger.debug(`getLongChannelIdFromShortChannelId(${channelName}, ${channelClaimId})`);\n return new Promise((resolve, reject) => {\n this\n .findAll({\n where: {\n name : channelName,\n claimId: {\n $like: `${channelClaimId}%`,\n },\n },\n order: [['height', 'ASC']],\n })\n .then(result => {\n switch (result.length) {\n case 0:\n return resolve(null);\n default: // note results must be sorted\n return resolve(result[0].claimId);\n }\n })\n .catch(error => {\n reject(error);\n });\n });\n };\n\n Certificate.getLongChannelIdFromChannelName = function (channelName) {\n logger.debug(`getLongChannelIdFromChannelName(${channelName})`);\n return new Promise((resolve, reject) => {\n this\n .findAll({\n where: { name: channelName },\n order: [['effectiveAmount', 'DESC'], ['height', 'ASC']],\n })\n .then(result => {\n switch (result.length) {\n case 0:\n return resolve(null);\n default:\n return resolve(result[0].claimId);\n }\n })\n .catch(error => {\n reject(error);\n });\n });\n };\n\n Certificate.validateLongChannelId = function (name, claimId) {\n logger.debug(`validateLongChannelId(${name}, ${claimId})`);\n return new Promise((resolve, reject) => {\n this.findOne({\n where: {name, claimId},\n })\n .then(result => {\n if (!result) {\n return resolve(null);\n };\n resolve(claimId);\n })\n .catch(error => {\n reject(error);\n });\n });\n };\n\n Certificate.getLongChannelId = function (channelName, channelClaimId) {\n logger.debug(`getLongChannelId(${channelName}, ${channelClaimId})`);\n if (channelClaimId && (channelClaimId.length === 40)) { // if a full channel id is provided\n return this.validateLongChannelId(channelName, channelClaimId);\n } else if (channelClaimId && channelClaimId.length < 40) { // if a short channel id is provided\n return this.getLongChannelIdFromShortChannelId(channelName, channelClaimId);\n } else {\n return this.getLongChannelIdFromChannelName(channelName); // if no channel id provided\n }\n };\n\n return Certificate;\n};\n\n\n\n// WEBPACK FOOTER //\n// ./models/certificate.js","module.exports = (sequelize, { STRING }) => {\n const Channel = sequelize.define(\n 'Channel',\n {\n channelName: {\n type : STRING,\n allowNull: false,\n },\n channelClaimId: {\n type : STRING,\n allowNull: false,\n },\n },\n {\n freezeTableName: true,\n }\n );\n\n Channel.associate = db => {\n Channel.belongsTo(db.User);\n Channel.hasOne(db.Certificate);\n };\n\n return Channel;\n};\n\n\n\n// WEBPACK FOOTER //\n// ./models/channel.js","const logger = require('winston');\nconst { returnShortId } = require('../helpers/sequelizeHelpers.js');\nconst { claim, site } = require('../config/speechConfig.js');\nconst { defaultThumbnail } = claim;\n\nfunction determineFileExtensionFromContentType (contentType) {\n switch (contentType) {\n case 'image/jpeg':\n case 'image/jpg':\n return 'jpeg';\n case 'image/png':\n return 'png';\n case 'image/gif':\n return 'gif';\n case 'video/mp4':\n return 'mp4';\n default:\n logger.debug('setting unknown file type as file extension jpeg');\n return 'jpeg';\n }\n};\n\nfunction determineThumbnail (storedThumbnail, defaultThumbnail) {\n if (storedThumbnail === '') {\n return defaultThumbnail;\n }\n return storedThumbnail;\n};\n\nfunction prepareClaimData (claim) {\n // logger.debug('preparing claim data based on resolved data:', claim);\n claim['thumbnail'] = determineThumbnail(claim.thumbnail, defaultThumbnail);\n claim['fileExt'] = determineFileExtensionFromContentType(claim.contentType);\n claim['host'] = site.host;\n return claim;\n};\n\nmodule.exports = (sequelize, { STRING, BOOLEAN, INTEGER, TEXT, DECIMAL }) => {\n const Claim = sequelize.define(\n 'Claim',\n {\n address: {\n type : STRING,\n default: null,\n },\n amount: {\n type : DECIMAL(19, 8),\n default: null,\n },\n claimId: {\n type : STRING,\n default: null,\n },\n claimSequence: {\n type : INTEGER,\n default: null,\n },\n decodedClaim: {\n type : BOOLEAN,\n default: null,\n },\n depth: {\n type : INTEGER,\n default: null,\n },\n effectiveAmount: {\n type : DECIMAL(19, 8),\n default: null,\n },\n hasSignature: {\n type : BOOLEAN,\n default: null,\n },\n height: {\n type : INTEGER,\n default: null,\n },\n hex: {\n type : TEXT('long'),\n default: null,\n },\n name: {\n type : STRING,\n default: null,\n },\n nout: {\n type : INTEGER,\n default: null,\n },\n txid: {\n type : STRING,\n default: null,\n },\n validAtHeight: {\n type : INTEGER,\n default: null,\n },\n outpoint: {\n type : STRING,\n default: null,\n },\n claimType: {\n type : STRING,\n default: null,\n },\n certificateId: {\n type : STRING,\n default: null,\n },\n author: {\n type : STRING,\n default: null,\n },\n description: {\n type : TEXT('long'),\n default: null,\n },\n language: {\n type : STRING,\n default: null,\n },\n license: {\n type : STRING,\n default: null,\n },\n licenseUrl: {\n type : STRING,\n default: null,\n },\n nsfw: {\n type : BOOLEAN,\n default: null,\n },\n preview: {\n type : STRING,\n default: null,\n },\n thumbnail: {\n type : STRING,\n default: null,\n },\n title: {\n type : STRING,\n default: null,\n },\n metadataVersion: {\n type : STRING,\n default: null,\n },\n contentType: {\n type : STRING,\n default: null,\n },\n source: {\n type : STRING,\n default: null,\n },\n sourceType: {\n type : STRING,\n default: null,\n },\n sourceVersion: {\n type : STRING,\n default: null,\n },\n streamVersion: {\n type : STRING,\n default: null,\n },\n valueVersion: {\n type : STRING,\n default: null,\n },\n channelName: {\n type : STRING,\n allowNull: true,\n default : null,\n },\n },\n {\n freezeTableName: true,\n }\n );\n\n Claim.associate = db => {\n Claim.belongsTo(db.File, {\n foreignKey: {\n allowNull: true,\n },\n });\n };\n\n Claim.getShortClaimIdFromLongClaimId = function (claimId, claimName) {\n logger.debug(`Claim.getShortClaimIdFromLongClaimId for ${claimName}#${claimId}`);\n return new Promise((resolve, reject) => {\n this\n .findAll({\n where: { name: claimName },\n order: [['height', 'ASC']],\n })\n .then(result => {\n switch (result.length) {\n case 0:\n throw new Error('No claim(s) found with that claim name');\n default:\n resolve(returnShortId(result, claimId));\n }\n })\n .catch(error => {\n reject(error);\n });\n });\n };\n\n Claim.getAllChannelClaims = function (channelClaimId) {\n logger.debug(`Claim.getAllChannelClaims for ${channelClaimId}`);\n return new Promise((resolve, reject) => {\n this\n .findAll({\n where: { certificateId: channelClaimId },\n order: [['height', 'ASC']],\n raw : true, // returns an array of only data, not an array of instances\n })\n .then(channelClaimsArray => {\n // logger.debug('channelclaimsarray length:', channelClaimsArray.length);\n switch (channelClaimsArray.length) {\n case 0:\n return resolve(null);\n default:\n channelClaimsArray.forEach(claim => {\n claim['fileExt'] = determineFileExtensionFromContentType(claim.contentType);\n claim['thumbnail'] = determineThumbnail(claim.thumbnail, defaultThumbnail);\n return claim;\n });\n return resolve(channelClaimsArray);\n }\n })\n .catch(error => {\n reject(error);\n });\n });\n };\n\n Claim.getClaimIdByLongChannelId = function (channelClaimId, claimName) {\n logger.debug(`finding claim id for claim ${claimName} from channel ${channelClaimId}`);\n return new Promise((resolve, reject) => {\n this\n .findAll({\n where: { name: claimName, certificateId: channelClaimId },\n order: [['id', 'ASC']],\n })\n .then(result => {\n switch (result.length) {\n case 0:\n return resolve(null);\n case 1:\n return resolve(result[0].claimId);\n default:\n logger.error(`${result.length} records found for \"${claimName}\" in channel \"${channelClaimId}\"`);\n return resolve(result[0].claimId);\n }\n })\n .catch(error => {\n reject(error);\n });\n });\n };\n\n Claim.getLongClaimIdFromShortClaimId = function (name, shortId) {\n return new Promise((resolve, reject) => {\n this\n .findAll({\n where: {\n name,\n claimId: {\n $like: `${shortId}%`,\n }},\n order: [['height', 'ASC']],\n })\n .then(result => {\n switch (result.length) {\n case 0:\n return resolve(null);\n default: // note results must be sorted\n return resolve(result[0].claimId);\n }\n })\n .catch(error => {\n reject(error);\n });\n });\n };\n\n Claim.getTopFreeClaimIdByClaimName = function (name) {\n return new Promise((resolve, reject) => {\n this\n .findAll({\n where: { name },\n order: [['effectiveAmount', 'DESC'], ['height', 'ASC']], // note: maybe height and effective amount need to switch?\n })\n .then(result => {\n logger.debug('length of result', result.length);\n switch (result.length) {\n case 0:\n return resolve(null);\n default:\n return resolve(result[0].dataValues.claimId);\n }\n })\n .catch(error => {\n reject(error);\n });\n });\n };\n\n Claim.validateLongClaimId = function (name, claimId) {\n return new Promise((resolve, reject) => {\n this.findOne({\n where: {name, claimId},\n })\n .then(result => {\n if (!result) {\n return resolve(null);\n };\n resolve(claimId);\n })\n .catch(error => {\n reject(error);\n });\n });\n };\n\n Claim.getLongClaimId = function (claimName, claimId) {\n logger.debug(`getLongClaimId(${claimName}, ${claimId})`);\n if (claimId && (claimId.length === 40)) { // if a full claim id is provided\n return this.validateLongClaimId(claimName, claimId);\n } else if (claimId && claimId.length < 40) {\n return this.getLongClaimIdFromShortClaimId(claimName, claimId); // if a short claim id is provided\n } else {\n return this.getTopFreeClaimIdByClaimName(claimName); // if no claim id is provided\n }\n };\n\n Claim.resolveClaim = function (name, claimId) {\n logger.debug(`Claim.resolveClaim: ${name} ${claimId}`);\n return new Promise((resolve, reject) => {\n this\n .findAll({\n where: { name, claimId },\n })\n .then(claimArray => {\n logger.debug('claims found on resolve:', claimArray.length);\n switch (claimArray.length) {\n case 0:\n return resolve(null);\n case 1:\n return resolve(prepareClaimData(claimArray[0].dataValues));\n default:\n logger.error(`more than one entry matches that name (${name}) and claimID (${claimId})`);\n return resolve(prepareClaimData(claimArray[0].dataValues));\n }\n })\n .catch(error => {\n reject(error);\n });\n });\n };\n\n return Claim;\n};\n\n\n\n// WEBPACK FOOTER //\n// ./models/claim.js","module.exports = (sequelize, { STRING, BOOLEAN, INTEGER }) => {\n const File = sequelize.define(\n 'File',\n {\n name: {\n type : STRING,\n allowNull: false,\n },\n claimId: {\n type : STRING,\n allowNull: false,\n },\n address: {\n type : STRING,\n allowNull: false,\n },\n outpoint: {\n type : STRING,\n allowNull: false,\n },\n height: {\n type : INTEGER,\n allowNull: false,\n default : 0,\n },\n fileName: {\n type : STRING,\n allowNull: false,\n },\n filePath: {\n type : STRING,\n allowNull: false,\n },\n fileType: {\n type: STRING,\n },\n nsfw: {\n type : BOOLEAN,\n allowNull : false,\n defaultValue: false,\n },\n trendingEligible: {\n type : BOOLEAN,\n allowNull : false,\n defaultValue: true,\n },\n },\n {\n freezeTableName: true,\n }\n );\n\n File.associate = db => {\n File.hasMany(db.Request);\n File.hasOne(db.Claim);\n };\n\n File.getRecentClaims = function () {\n return this.findAll({\n where: { nsfw: false, trendingEligible: true },\n order: [['createdAt', 'DESC']],\n limit: 25,\n });\n };\n\n return File;\n};\n\n\n\n// WEBPACK FOOTER //\n// ./models/file.js","module.exports = (sequelize, { STRING, BOOLEAN, TEXT }) => {\n const Request = sequelize.define(\n 'Request',\n {\n action: {\n type : STRING,\n allowNull: false,\n },\n url: {\n type : STRING,\n allowNull: false,\n },\n ipAddress: {\n type : STRING,\n allowNull: true,\n },\n result: {\n type : TEXT('long'),\n allowNull: true,\n default : null,\n },\n },\n {\n freezeTableName: true,\n }\n );\n\n Request.associate = db => {\n Request.belongsTo(db.File, {\n foreignKey: {\n allowNull: true,\n },\n });\n };\n\n return Request;\n};\n\n\n\n// WEBPACK FOOTER //\n// ./models/request.js","'use strict';\nconst bcrypt = require('bcrypt');\nconst logger = require('winston');\n\nmodule.exports = (sequelize, { STRING }) => {\n const User = sequelize.define(\n 'User',\n {\n userName: {\n type : STRING,\n allowNull: false,\n },\n password: {\n type : STRING,\n allowNull: false,\n },\n },\n {\n freezeTableName: true,\n }\n );\n\n User.associate = db => {\n User.hasOne(db.Channel);\n };\n\n User.prototype.comparePassword = function (password) {\n return bcrypt.compare(password, this.password);\n };\n\n User.prototype.changePassword = function (newPassword) {\n return new Promise((resolve, reject) => {\n // generate a salt string to use for hashing\n bcrypt.genSalt((saltError, salt) => {\n if (saltError) {\n logger.error('salt error', saltError);\n reject(saltError);\n return;\n }\n // generate a hashed version of the user's password\n bcrypt.hash(newPassword, salt, (hashError, hash) => {\n // if there is an error with the hash generation return the error\n if (hashError) {\n logger.error('hash error', hashError);\n reject(hashError);\n return;\n }\n // replace the current password with the new hash\n this\n .update({password: hash})\n .then(() => {\n resolve();\n })\n .catch(error => {\n reject(error);\n });\n });\n });\n });\n };\n\n // pre-save hook method to hash the user's password before the user's info is saved to the db.\n User.hook('beforeCreate', (user, options) => {\n logger.debug('User.beforeCreate hook...');\n return new Promise((resolve, reject) => {\n // generate a salt string to use for hashing\n bcrypt.genSalt((saltError, salt) => {\n if (saltError) {\n logger.error('salt error', saltError);\n reject(saltError);\n return;\n }\n // generate a hashed version of the user's password\n bcrypt.hash(user.password, salt, (hashError, hash) => {\n // if there is an error with the hash generation return the error\n if (hashError) {\n logger.error('hash error', hashError);\n reject(hashError);\n return;\n }\n // replace the password string with the hash password value\n user.password = hash;\n resolve();\n });\n });\n });\n });\n\n return User;\n};\n\n\n\n// WEBPACK FOOTER //\n// ./models/user.js","module.exports = require(\"bcrypt\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"bcrypt\"\n// module id = 66\n// module chunks = 0","module.exports = require(\"axios\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"axios\"\n// module id = 67\n// module chunks = 0","module.exports = require(\"universal-analytics\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"universal-analytics\"\n// module id = 68\n// module chunks = 0","const PassportLocalStrategy = require('passport-local').Strategy;\nconst db = require('../models');\nconst logger = require('winston');\n\nfunction returnUserAndChannelInfo (userInstance) {\n return new Promise((resolve, reject) => {\n let userInfo = {};\n userInfo['id'] = userInstance.id;\n userInfo['userName'] = userInstance.userName;\n userInstance\n .getChannel()\n .then(({channelName, channelClaimId}) => {\n userInfo['channelName'] = channelName;\n userInfo['channelClaimId'] = channelClaimId;\n return db.Certificate.getShortChannelIdFromLongChannelId(channelClaimId, channelName);\n })\n .then(shortChannelId => {\n userInfo['shortChannelId'] = shortChannelId;\n resolve(userInfo);\n })\n .catch(error => {\n reject(error);\n });\n });\n}\n\nmodule.exports = new PassportLocalStrategy(\n {\n usernameField: 'username',\n passwordField: 'password',\n },\n (username, password, done) => {\n return db.User\n .findOne({\n where: {userName: username},\n })\n .then(user => {\n if (!user) {\n logger.debug('no user found');\n return done(null, false, {message: 'Incorrect username or password'});\n }\n return user.comparePassword(password)\n .then(isMatch => {\n if (!isMatch) {\n logger.debug('incorrect password');\n return done(null, false, {message: 'Incorrect username or password'});\n }\n logger.debug('Password was a match, returning User');\n return returnUserAndChannelInfo(user)\n .then(userInfo => {\n return done(null, userInfo);\n })\n .catch(error => {\n return error;\n });\n })\n .catch(error => {\n return error;\n });\n })\n .catch(error => {\n return done(error);\n });\n }\n);\n\n\n\n// WEBPACK FOOTER //\n// ./passport/local-login.js","const logger = require('winston');\nconst passport = require('passport');\n\nmodule.exports = (app) => {\n // route for sign up\n app.post('/signup', passport.authenticate('local-signup'), (req, res) => {\n logger.verbose(`successful signup for ${req.user.channelName}`);\n res.status(200).json({\n success : true,\n channelName : req.user.channelName,\n channelClaimId: req.user.channelClaimId,\n shortChannelId: req.user.shortChannelId,\n });\n });\n // route for log in\n app.post('/login', (req, res, next) => {\n passport.authenticate('local-login', (err, user, info) => {\n logger.debug('info:', info);\n if (err) {\n return next(err);\n }\n if (!user) {\n return res.status(400).json({\n success: false,\n message: info.message,\n });\n }\n logger.debug('successful login');\n req.logIn(user, (err) => {\n if (err) {\n return next(err);\n }\n return res.status(200).json({\n success : true,\n channelName : req.user.channelName,\n channelClaimId: req.user.channelClaimId,\n shortChannelId: req.user.shortChannelId,\n });\n });\n })(req, res, next);\n });\n // route to log out\n app.get('/logout', (req, res) => {\n req.logout();\n res.status(200).json({success: true, message: 'you successfully logged out'});\n });\n // see if user is authenticated, and return credentials if so\n app.get('/user', (req, res) => {\n if (req.user) {\n res.status(200).json({success: true, data: req.user});\n } else {\n res.status(401).json({success: false, message: 'user is not logged in'});\n }\n });\n};\n\n\n\n// WEBPACK FOOTER //\n// ./routes/auth-routes.js","const logger = require('winston');\nconst multipart = require('connect-multiparty');\nconst { files, site } = require('../config/speechConfig.js');\nconst multipartMiddleware = multipart({uploadDir: files.uploadDirectory});\nconst db = require('../models');\nconst { claimNameIsAvailable, checkChannelAvailability, publish } = require('../controllers/publishController.js');\nconst { getClaimList, resolveUri, getClaim } = require('../helpers/lbryApi.js');\nconst { addGetResultsToFileData, createBasicPublishParams, createThumbnailPublishParams, parsePublishApiRequestBody, parsePublishApiRequestFiles, createFileData } = require('../helpers/publishHelpers.js');\nconst errorHandlers = require('../helpers/errorHandlers.js');\nconst { sendGATimingEvent } = require('../helpers/googleAnalytics.js');\nconst { authenticateUser } = require('../auth/authentication.js');\nconst { getChannelData, getChannelClaims, getClaimId } = require('../controllers/serveController.js');\n\nconst NO_CHANNEL = 'NO_CHANNEL';\nconst NO_CLAIM = 'NO_CLAIM';\n\nmodule.exports = (app) => {\n // route to check whether site has published to a channel\n app.get('/api/channel/availability/:name', ({ ip, originalUrl, params }, res) => {\n checkChannelAvailability(params.name)\n .then(result => {\n if (result === true) {\n res.status(200).json(true);\n } else {\n res.status(200).json(false);\n }\n })\n .catch(error => {\n errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n });\n });\n // route to get a short channel id from long channel Id\n app.get('/api/channel/short-id/:longId/:name', ({ ip, originalUrl, params }, res) => {\n db.Certificate.getShortChannelIdFromLongChannelId(params.longId, params.name)\n .then(shortId => {\n res.status(200).json(shortId);\n })\n .catch(error => {\n errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n });\n });\n app.get('/api/channel/data/:channelName/:channelClaimId', ({ ip, originalUrl, body, params }, res) => {\n const channelName = params.channelName;\n let channelClaimId = params.channelClaimId;\n if (channelClaimId === 'none') channelClaimId = null;\n getChannelData(channelName, channelClaimId, 0)\n .then(data => {\n if (data === NO_CHANNEL) {\n return res.status(404).json({success: false, message: 'No matching channel was found'});\n }\n res.status(200).json({success: true, data});\n })\n .catch(error => {\n errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n });\n });\n app.get('/api/channel/claims/:channelName/:channelClaimId/:page', ({ ip, originalUrl, body, params }, res) => {\n const channelName = params.channelName;\n let channelClaimId = params.channelClaimId;\n if (channelClaimId === 'none') channelClaimId = null;\n const page = params.page;\n getChannelClaims(channelName, channelClaimId, page)\n .then(data => {\n if (data === NO_CHANNEL) {\n return res.status(404).json({success: false, message: 'No matching channel was found'});\n }\n res.status(200).json({success: true, data});\n })\n .catch(error => {\n errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n });\n });\n // route to run a claim_list request on the daemon\n app.get('/api/claim/list/:name', ({ ip, originalUrl, params }, res) => {\n getClaimList(params.name)\n .then(claimsList => {\n res.status(200).json(claimsList);\n })\n .catch(error => {\n errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n });\n });\n // route to get an asset\n app.get('/api/claim/get/:name/:claimId', ({ ip, originalUrl, params }, res) => {\n const name = params.name;\n const claimId = params.claimId;\n // resolve the claim\n db.Claim.resolveClaim(name, claimId)\n .then(resolveResult => {\n // make sure a claim actually exists at that uri\n if (!resolveResult) {\n throw new Error('No matching uri found in Claim table');\n }\n let fileData = createFileData(resolveResult);\n // get the claim\n return Promise.all([fileData, getClaim(`${name}#${claimId}`)]);\n })\n .then(([ fileData, getResult ]) => {\n fileData = addGetResultsToFileData(fileData, getResult);\n return Promise.all([db.upsert(db.File, fileData, {name, claimId}, 'File'), getResult]);\n })\n .then(([ fileRecord, {message, completed} ]) => {\n res.status(200).json({ success: true, message, completed });\n })\n .catch(error => {\n errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n });\n });\n // route to check whether this site published to a claim\n app.get('/api/claim/availability/:name', ({ ip, originalUrl, params }, res) => {\n claimNameIsAvailable(params.name)\n .then(result => {\n res.status(200).json(result);\n })\n .catch(error => {\n errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n });\n });\n // route to run a resolve request on the daemon\n app.get('/api/claim/resolve/:name/:claimId', ({ headers, ip, originalUrl, params }, res) => {\n resolveUri(`${params.name}#${params.claimId}`)\n .then(resolvedUri => {\n res.status(200).json(resolvedUri);\n })\n .catch(error => {\n errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n });\n });\n // route to run a publish request on the daemon\n app.post('/api/claim/publish', multipartMiddleware, ({ body, files, headers, ip, originalUrl, user }, res) => {\n logger.debug('api/claim/publish req.body:', body);\n logger.debug('api/claim/publish req.files:', files);\n // define variables\n let channelName, channelId, channelPassword, description, fileName, filePath, fileType, gaStartTime, license, name, nsfw, thumbnail, thumbnailFileName, thumbnailFilePath, thumbnailFileType, title;\n // record the start time of the request\n gaStartTime = Date.now();\n // validate the body and files of the request\n try {\n // validateApiPublishRequest(body, files);\n ({name, nsfw, license, title, description, thumbnail} = parsePublishApiRequestBody(body));\n ({fileName, filePath, fileType, thumbnailFileName, thumbnailFilePath, thumbnailFileType} = parsePublishApiRequestFiles(files));\n ({channelName, channelId, channelPassword} = body);\n } catch (error) {\n return res.status(400).json({success: false, message: error.message});\n }\n // check channel authorization\n Promise.all([\n authenticateUser(channelName, channelId, channelPassword, user),\n claimNameIsAvailable(name),\n createBasicPublishParams(filePath, name, title, description, license, nsfw, thumbnail),\n createThumbnailPublishParams(thumbnailFilePath, name, license, nsfw),\n ])\n .then(([{channelName, channelClaimId}, validatedClaimName, publishParams, thumbnailPublishParams]) => {\n // add channel details to the publish params\n if (channelName && channelClaimId) {\n publishParams['channel_name'] = channelName;\n publishParams['channel_id'] = channelClaimId;\n }\n // publish the thumbnail\n if (thumbnailPublishParams) {\n publish(thumbnailPublishParams, thumbnailFileName, thumbnailFileType);\n }\n // publish the asset\n return publish(publishParams, fileName, fileType);\n })\n .then(result => {\n res.status(200).json({\n success: true,\n message: 'publish completed successfully',\n data : {\n name,\n claimId: result.claim_id,\n url : `${site.host}/${result.claim_id}/${name}`,\n lbryTx : result,\n },\n });\n // record the publish end time and send to google analytics\n sendGATimingEvent('end-to-end', 'publish', fileType, gaStartTime, Date.now());\n })\n .catch(error => {\n errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n });\n });\n // route to get a short claim id from long claim Id\n app.get('/api/claim/short-id/:longId/:name', ({ ip, originalUrl, body, params }, res) => {\n db.Claim.getShortClaimIdFromLongClaimId(params.longId, params.name)\n .then(shortId => {\n res.status(200).json({success: true, data: shortId});\n })\n .catch(error => {\n errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n });\n });\n app.post('/api/claim/long-id', ({ ip, originalUrl, body, params }, res) => {\n logger.debug('body:', body);\n const channelName = body.channelName;\n const channelClaimId = body.channelClaimId;\n const claimName = body.claimName;\n const claimId = body.claimId;\n getClaimId(channelName, channelClaimId, claimName, claimId)\n .then(result => {\n if (result === NO_CHANNEL) {\n return res.status(404).json({success: false, message: 'No matching channel could be found'});\n }\n if (result === NO_CLAIM) {\n return res.status(404).json({success: false, message: 'No matching claim id could be found'});\n }\n res.status(200).json({success: true, data: result});\n })\n .catch(error => {\n errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n });\n });\n app.get('/api/claim/data/:claimName/:claimId', ({ ip, originalUrl, body, params }, res) => {\n const claimName = params.claimName;\n let claimId = params.claimId;\n if (claimId === 'none') claimId = null;\n db.Claim.resolveClaim(claimName, claimId)\n .then(claimInfo => {\n if (!claimInfo) {\n return res.status(404).json({success: false, message: 'No claim could be found'});\n }\n res.status(200).json({success: true, data: claimInfo});\n })\n .catch(error => {\n errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n });\n });\n // route to see if asset is available locally\n app.get('/api/file/availability/:name/:claimId', ({ ip, originalUrl, params }, res) => {\n const name = params.name;\n const claimId = params.claimId;\n db.File.findOne({where: {name, claimId}})\n .then(result => {\n if (result) {\n return res.status(200).json({success: true, data: true});\n }\n res.status(200).json({success: true, data: false});\n })\n .catch(error => {\n errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n });\n });\n};\n\n\n\n// WEBPACK FOOTER //\n// ./routes/api-routes.js","module.exports = require(\"connect-multiparty\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"connect-multiparty\"\n// module id = 72\n// module chunks = 0","const logger = require('winston');\nconst db = require('../models');\nconst lbryApi = require('../helpers/lbryApi.js');\nconst publishHelpers = require('../helpers/publishHelpers.js');\nconst config = require('../config/speechConfig.js');\n\nmodule.exports = {\n publish (publishParams, fileName, fileType) {\n return new Promise((resolve, reject) => {\n let publishResults, certificateId, channelName;\n // publish the file\n return lbryApi.publishClaim(publishParams)\n .then(tx => {\n logger.info(`Successfully published ${publishParams.name} ${fileName}`, tx);\n publishResults = tx;\n // get the channel information\n if (publishParams.channel_name) {\n logger.debug(`this claim was published in channel: ${publishParams.channel_name}`);\n return db.Channel.findOne({where: {channelName: publishParams.channel_name}});\n } else {\n logger.debug('this claim was not published in a channel');\n return null;\n }\n })\n .then(channel => {\n // set channel information\n certificateId = null;\n channelName = null;\n if (channel) {\n certificateId = channel.channelClaimId;\n channelName = channel.channelName;\n }\n logger.debug(`certificateId: ${certificateId}`);\n })\n .then(() => {\n // create the File record\n const fileRecord = {\n name : publishParams.name,\n claimId : publishResults.claim_id,\n title : publishParams.metadata.title,\n description: publishParams.metadata.description,\n address : publishParams.claim_address,\n outpoint : `${publishResults.txid}:${publishResults.nout}`,\n height : 0,\n fileName,\n filePath : publishParams.file_path,\n fileType,\n nsfw : publishParams.metadata.nsfw,\n };\n // create the Claim record\n const claimRecord = {\n name : publishParams.name,\n claimId : publishResults.claim_id,\n title : publishParams.metadata.title,\n description: publishParams.metadata.description,\n address : publishParams.claim_address,\n thumbnail : publishParams.metadata.thumbnail,\n outpoint : `${publishResults.txid}:${publishResults.nout}`,\n height : 0,\n contentType: fileType,\n nsfw : publishParams.metadata.nsfw,\n amount : publishParams.bid,\n certificateId,\n channelName,\n };\n // upsert criteria\n const upsertCriteria = {\n name : publishParams.name,\n claimId: publishResults.claim_id,\n };\n // upsert the records\n return Promise.all([db.upsert(db.File, fileRecord, upsertCriteria, 'File'), db.upsert(db.Claim, claimRecord, upsertCriteria, 'Claim')]);\n })\n .then(([file, claim]) => {\n logger.debug('File and Claim records successfully created');\n return Promise.all([file.setClaim(claim), claim.setFile(file)]);\n })\n .then(() => {\n logger.debug('File and Claim records successfully associated');\n resolve(publishResults); // resolve the promise with the result from lbryApi.publishClaim;\n })\n .catch(error => {\n logger.error('PUBLISH ERROR', error);\n publishHelpers.deleteTemporaryFile(publishParams.file_path); // delete the local file\n reject(error);\n });\n });\n },\n claimNameIsAvailable (name) {\n // find any records where the name is used\n return db.File.findAll({ where: { name } })\n .then(result => {\n if (result.length >= 1) {\n const claimAddress = config.wallet.lbryClaimAddress;\n // filter out any results that were not published from spee.ch's wallet address\n const filteredResult = result.filter((claim) => {\n return (claim.address === claimAddress);\n });\n // return based on whether any non-spee.ch claims were left\n if (filteredResult.length >= 1) {\n throw new Error('That claim is already in use');\n };\n return name;\n };\n return name;\n });\n },\n checkChannelAvailability (name) {\n return new Promise((resolve, reject) => {\n // find any records where the name is used\n db.Channel.findAll({ where: { channelName: name } })\n .then(result => {\n if (result.length >= 1) {\n return resolve(false);\n }\n resolve(true);\n })\n .catch(error => {\n reject(error);\n });\n });\n },\n};\n\n\n\n// WEBPACK FOOTER //\n// ./controllers/publishController.js","module.exports = require(\"fs\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"fs\"\n// module id = 74\n// module chunks = 0","const db = require('../models');\nconst logger = require('winston');\n\nmodule.exports = {\n authenticateUser (channelName, channelId, channelPassword, user) {\n // case: no channelName or channel Id are provided (anonymous), regardless of whether user token is provided\n if (!channelName && !channelId) {\n return {\n channelName : null,\n channelClaimId: null,\n };\n }\n // case: channelName or channel Id are provided with user token\n if (user) {\n if (channelName && channelName !== user.channelName) {\n throw new Error('the provided channel name does not match user credentials');\n }\n if (channelId && channelId !== user.channelClaimId) {\n throw new Error('the provided channel id does not match user credentials');\n }\n return {\n channelName : user.channelName,\n channelClaimId: user.channelClaimId,\n };\n }\n // case: channelName or channel Id are provided with password instead of user token\n if (!channelPassword) throw new Error('no channel password provided');\n return module.exports.authenticateChannelCredentials(channelName, channelId, channelPassword);\n },\n authenticateChannelCredentials (channelName, channelId, userPassword) {\n return new Promise((resolve, reject) => {\n // hoisted variables\n let channelData;\n // build the params for finding the channel\n let channelFindParams = {};\n if (channelName) channelFindParams['channelName'] = channelName;\n if (channelId) channelFindParams['channelClaimId'] = channelId;\n // find the channel\n db.Channel\n .findOne({\n where: channelFindParams,\n })\n .then(channel => {\n if (!channel) {\n logger.debug('no channel found');\n throw new Error('Authentication failed, you do not have access to that channel');\n }\n channelData = channel.get();\n logger.debug('channel data:', channelData);\n return db.User.findOne({\n where: { userName: channelData.channelName.substring(1) },\n });\n })\n .then(user => {\n if (!user) {\n logger.debug('no user found');\n throw new Error('Authentication failed, you do not have access to that channel');\n }\n return user.comparePassword(userPassword);\n })\n .then(isMatch => {\n if (!isMatch) {\n logger.debug('incorrect password');\n throw new Error('Authentication failed, you do not have access to that channel');\n }\n logger.debug('...password was a match...');\n resolve(channelData);\n })\n .catch(error => {\n reject(error);\n });\n });\n },\n};\n\n\n\n// WEBPACK FOOTER //\n// ./auth/authentication.js","const CLAIMS_PER_PAGE = 12;\n\nmodule.exports = {\n returnPaginatedChannelClaims (channelName, longChannelClaimId, claims, page) {\n const totalPages = module.exports.determineTotalPages(claims);\n const paginationPage = module.exports.getPageFromQuery(page);\n const viewData = {\n channelName : channelName,\n longChannelClaimId: longChannelClaimId,\n claims : module.exports.extractPageFromClaims(claims, paginationPage),\n previousPage : module.exports.determinePreviousPage(paginationPage),\n currentPage : paginationPage,\n nextPage : module.exports.determineNextPage(totalPages, paginationPage),\n totalPages : totalPages,\n totalResults : module.exports.determineTotalClaims(claims),\n };\n return viewData;\n },\n getPageFromQuery (page) {\n if (page) {\n return parseInt(page);\n }\n return 1;\n },\n extractPageFromClaims (claims, pageNumber) {\n if (!claims) {\n return []; // if no claims, return this default\n }\n // logger.debug('claims is array?', Array.isArray(claims));\n // logger.debug(`pageNumber ${pageNumber} is number?`, Number.isInteger(pageNumber));\n const claimStartIndex = (pageNumber - 1) * CLAIMS_PER_PAGE;\n const claimEndIndex = claimStartIndex + CLAIMS_PER_PAGE;\n const pageOfClaims = claims.slice(claimStartIndex, claimEndIndex);\n return pageOfClaims;\n },\n determineTotalPages (claims) {\n if (!claims) {\n return 0;\n } else {\n const totalClaims = claims.length;\n if (totalClaims < CLAIMS_PER_PAGE) {\n return 1;\n }\n const fullPages = Math.floor(totalClaims / CLAIMS_PER_PAGE);\n const remainder = totalClaims % CLAIMS_PER_PAGE;\n if (remainder === 0) {\n return fullPages;\n }\n return fullPages + 1;\n }\n },\n determinePreviousPage (currentPage) {\n if (currentPage === 1) {\n return null;\n }\n return currentPage - 1;\n },\n determineNextPage (totalPages, currentPage) {\n if (currentPage === totalPages) {\n return null;\n }\n return currentPage + 1;\n },\n determineTotalClaims (claims) {\n if (!claims) {\n return 0;\n }\n return claims.length;\n },\n};\n\n\n\n// WEBPACK FOOTER //\n// ./helpers/channelPagination.js","const { site } = require('../config/speechConfig.js');\nconst handlePageRender = require('../helpers/handlePageRender.jsx');\n\nmodule.exports = (app) => {\n // route for the home page\n app.get('/', (req, res) => {\n handlePageRender(req, res);\n });\n // route to display login page\n app.get('/login', (req, res) => {\n handlePageRender(req, res);\n });\n // route to show 'about' page\n app.get('/about', (req, res) => {\n handlePageRender(req, res);\n });\n // route to display a list of the trending images\n app.get('/trending', (req, res) => {\n res.status(301).redirect('/popular');\n });\n app.get('/popular', (req, res) => {\n handlePageRender(req, res);\n });\n // route to display a list of the trending images\n app.get('/new', (req, res) => {\n handlePageRender(req, res);\n });\n // route to send embedable video player (for twitter)\n app.get('/embed/:claimId/:name', ({ params }, res) => {\n const claimId = params.claimId;\n const name = params.name;\n const host = site.host;\n // get and render the content\n res.status(200).render('embed', { layout: 'embed', host, claimId, name });\n });\n};\n\n\n\n// WEBPACK FOOTER //\n// ./routes/page-routes.js","import * as actions from 'constants/publish_action_types';\nimport { LOGIN } from 'constants/publish_channel_select_states';\nconst { publish } = require('../../config/speechConfig.js');\n\nconst initialState = {\n publishInChannel : false,\n selectedChannel : LOGIN,\n showMetadataInputs: false,\n status : {\n status : null,\n message: null,\n },\n error: {\n file : null,\n url : null,\n channel : null,\n publishSubmit: null,\n },\n file : null,\n claim : '',\n metadata: {\n title : '',\n description: '',\n license : '',\n nsfw : false,\n },\n thumbnailChannel : publish.thumbnailChannel,\n thumbnailChannelId: publish.thumbnailChannelId,\n thumbnail : null,\n};\n\nexport default function (state = initialState, action) {\n switch (action.type) {\n case actions.FILE_SELECTED:\n return Object.assign({}, initialState, { // note: clears to initial state\n file: action.data,\n });\n case actions.FILE_CLEAR:\n return initialState;\n case actions.METADATA_UPDATE:\n return Object.assign({}, state, {\n metadata: Object.assign({}, state.metadata, {\n [action.data.name]: action.data.value,\n }),\n });\n case actions.CLAIM_UPDATE:\n return Object.assign({}, state, {\n claim: action.data,\n });\n case actions.SET_PUBLISH_IN_CHANNEL:\n return Object.assign({}, state, {\n publishInChannel: action.channel,\n });\n case actions.PUBLISH_STATUS_UPDATE:\n return Object.assign({}, state, {\n status: action.data,\n });\n case actions.ERROR_UPDATE:\n return Object.assign({}, state, {\n error: Object.assign({}, state.error, {\n [action.data.name]: action.data.value,\n }),\n });\n case actions.SELECTED_CHANNEL_UPDATE:\n return Object.assign({}, state, {\n selectedChannel: action.data,\n });\n case actions.TOGGLE_METADATA_INPUTS:\n return Object.assign({}, state, {\n showMetadataInputs: action.data,\n });\n case actions.THUMBNAIL_NEW:\n return Object.assign({}, state, {\n thumbnail: action.data,\n });\n default:\n return state;\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./react/reducers/publish.js","import * as actions from 'constants/channel_action_types';\n\nconst initialState = {\n loggedInChannel: {\n name : null,\n shortId: null,\n longId : null,\n },\n};\n\nexport default function (state = initialState, action) {\n switch (action.type) {\n case actions.CHANNEL_UPDATE:\n return Object.assign({}, state, {\n loggedInChannel: action.data,\n });\n default:\n return state;\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./react/reducers/channel.js","import * as actions from 'constants/show_action_types';\nimport { LOCAL_CHECK, ERROR } from 'constants/asset_display_states';\n\nconst initialState = {\n request: {\n error: null,\n type : null,\n id : null,\n },\n requestList : {},\n channelList : {},\n assetList : {},\n displayAsset: {\n error : null,\n status: LOCAL_CHECK,\n },\n};\n\nexport default function (state = initialState, action) {\n switch (action.type) {\n // handle request\n case actions.REQUEST_ERROR:\n return Object.assign({}, state, {\n request: Object.assign({}, state.request, {\n error: action.data,\n }),\n });\n case actions.REQUEST_UPDATE:\n return Object.assign({}, state, {\n request: Object.assign({}, state.request, {\n type: action.data.requestType,\n id : action.data.requestId,\n }),\n });\n // store requests\n case actions.REQUEST_LIST_ADD:\n return Object.assign({}, state, {\n requestList: Object.assign({}, state.requestList, {\n [action.data.id]: {\n error: action.data.error,\n key : action.data.key,\n },\n }),\n });\n // asset data\n case actions.ASSET_ADD:\n return Object.assign({}, state, {\n assetList: Object.assign({}, state.assetList, {\n [action.data.id]: {\n error : action.data.error,\n name : action.data.name,\n claimId : action.data.claimId,\n shortId : action.data.shortId,\n claimData: action.data.claimData,\n },\n }),\n });\n // channel data\n case actions.CHANNEL_ADD:\n return Object.assign({}, state, {\n channelList: Object.assign({}, state.channelList, {\n [action.data.id]: {\n name : action.data.name,\n longId : action.data.longId,\n shortId : action.data.shortId,\n claimsData: action.data.claimsData,\n },\n }),\n });\n case actions.CHANNEL_CLAIMS_UPDATE_SUCCESS:\n return Object.assign({}, state, {\n channelList: Object.assign({}, state.channelList, {\n [action.data.channelListId]: Object.assign({}, state.channelList[action.data.channelListId], {\n claimsData: action.data.claimsData,\n }),\n }),\n });\n // display an asset\n case actions.FILE_AVAILABILITY_UPDATE:\n return Object.assign({}, state, {\n displayAsset: Object.assign({}, state.displayAsset, {\n status: action.data,\n }),\n });\n case actions.DISPLAY_ASSET_ERROR:\n return Object.assign({}, state, {\n displayAsset: Object.assign({}, state.displayAsset, {\n error : action.data,\n status: ERROR,\n }),\n });\n default:\n return state;\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./react/reducers/show.js","const { site } = require('../../config/speechConfig.js');\n\nconst initialState = {\n host: site.host,\n};\n\nexport default function (state = initialState, action) {\n switch (action.type) {\n default:\n return state;\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./react/reducers/site.js","module.exports = require(\"react-ga\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"react-ga\"\n// module id = 82\n// module chunks = 0","import React from 'react';\nimport SEO from 'components/SEO';\nimport NavBar from 'containers/NavBar';\nimport PublishTool from 'containers/PublishTool';\n\nclass HomePage extends React.Component {\n render () {\n return (\n
\n \n \n
\n \n
\n
\n );\n }\n};\n\nexport default HomePage;\n\n\n\n// WEBPACK FOOTER //\n// ./react/components/HomePage/index.jsx","const { site: { title: siteTitle } } = require('../../config/speechConfig.js');\n\nexport const createPageTitle = (pageTitle) => {\n if (!pageTitle) {\n return `${siteTitle}`;\n }\n return `${siteTitle} - ${pageTitle}`;\n};\n\n\n\n// WEBPACK FOOTER //\n// ./react/utils/pageTitle.js","const { site: { title, host, description }, claim: { defaultThumbnail, defaultDescription } } = require('../../config/speechConfig.js');\n\nconst determineOgThumbnailContentType = (thumbnail) => {\n if (thumbnail) {\n const fileExt = thumbnail.substring(thumbnail.lastIndexOf('.'));\n switch (fileExt) {\n case 'jpeg':\n case 'jpg':\n return 'image/jpeg';\n case 'png':\n return 'image/png';\n case 'gif':\n return 'image/gif';\n case 'mp4':\n return 'video/mp4';\n default:\n return 'image/jpeg';\n }\n }\n return '';\n};\n\nconst createBasicMetaTags = () => {\n return [\n {property: 'og:title', content: title},\n {property: 'og:url', content: host},\n {property: 'og:site_name', content: title},\n {property: 'og:description', content: description},\n {property: 'twitter:site', content: '@spee_ch'},\n {property: 'twitter:card', content: 'summary'},\n ];\n};\n\nconst createChannelMetaTags = (channel) => {\n const { name, longId } = channel;\n return [\n {property: 'og:title', content: `${name} on ${title}`},\n {property: 'og:url', content: `${host}/${name}:${longId}`},\n {property: 'og:site_name', content: title},\n {property: 'og:description', content: `${name}, a channel on ${title}`},\n {property: 'twitter:site', content: '@spee_ch'},\n {property: 'twitter:card', content: 'summary'},\n ];\n};\n\nconst createAssetMetaTags = (asset) => {\n const { claimData } = asset;\n const { contentType } = claimData;\n const embedUrl = `${host}/${claimData.claimId}/${claimData.name}`;\n const showUrl = `${host}/${claimData.claimId}/${claimData.name}`;\n const source = `${host}/${claimData.claimId}/${claimData.name}.${claimData.fileExt}`;\n const ogTitle = claimData.title || claimData.name;\n const ogDescription = claimData.description || defaultDescription;\n const ogThumbnailContentType = determineOgThumbnailContentType(claimData.thumbnail);\n const ogThumbnail = claimData.thumbnail || defaultThumbnail;\n const metaTags = [\n {property: 'og:title', content: ogTitle},\n {property: 'og:url', content: showUrl},\n {property: 'og:site_name', content: title},\n {property: 'og:description', content: ogDescription},\n {property: 'og:image:width', content: 600},\n {property: 'og:image:height', content: 315},\n {property: 'twitter:site', content: '@spee_ch'},\n ];\n if (contentType === 'video/mp4' || contentType === 'video/webm') {\n metaTags.push({property: 'og:video', content: source});\n metaTags.push({property: 'og:video:secure_url', content: source});\n metaTags.push({property: 'og:video:type', content: contentType});\n metaTags.push({property: 'og:image', content: ogThumbnail});\n metaTags.push({property: 'og:image:type', content: ogThumbnailContentType});\n metaTags.push({property: 'og:type', content: 'video'});\n metaTags.push({property: 'twitter:card', content: 'player'});\n metaTags.push({property: 'twitter:player', content: embedUrl});\n metaTags.push({property: 'twitter:player:width', content: 600});\n metaTags.push({property: 'twitter:text:player_width', content: 600});\n metaTags.push({property: 'twitter:player:height', content: 337});\n metaTags.push({property: 'twitter:player:stream', content: source});\n metaTags.push({property: 'twitter:player:stream:content_type', content: contentType});\n } else {\n metaTags.push({property: 'og:image', content: source});\n metaTags.push({property: 'og:image:type', content: contentType});\n metaTags.push({property: 'og:type', content: 'article'});\n metaTags.push({property: 'twitter:card', content: 'summary_large_image'});\n }\n return metaTags;\n};\n\nexport const createMetaTags = (asset, channel) => {\n if (asset) {\n return createAssetMetaTags(asset);\n };\n if (channel) {\n return createChannelMetaTags(channel);\n };\n return createBasicMetaTags();\n};\n\n\n\n// WEBPACK FOOTER //\n// ./react/utils/metaTags.js","const { site: { host } } = require('../../config/speechConfig.js');\n\nconst createBasicCanonicalLink = (page) => {\n if (!page) {\n return `${host}`;\n };\n return `${host}/${page}`;\n};\n\nconst createAssetCanonicalLink = (asset) => {\n let channelName, certificateId, name, claimId;\n if (asset.claimData) {\n ({ channelName, certificateId, name, claimId } = asset.claimData);\n };\n if (channelName) {\n return `${host}/${channelName}:${certificateId}/${name}`;\n };\n return `${host}/${claimId}/${name}`;\n};\n\nconst createChannelCanonicalLink = (channel) => {\n const { name, longId } = channel;\n return `${host}/${name}:${longId}`;\n};\n\nexport const createCanonicalLink = (asset, channel, page) => {\n if (asset) {\n return createAssetCanonicalLink(asset);\n }\n if (channel) {\n return createChannelCanonicalLink(channel);\n }\n if (page) {\n return createBasicCanonicalLink(page);\n }\n return createBasicCanonicalLink();\n};\n\n\n\n// WEBPACK FOOTER //\n// ./react/utils/canonicalLink.js","import React from 'react';\nimport { NavLink, withRouter } from 'react-router-dom';\nimport Logo from 'components/Logo';\nimport NavBarChannelDropdown from 'components/NavBarChannelOptionsDropdown';\nimport request from 'utils/request';\n\nconst VIEW = 'VIEW';\nconst LOGOUT = 'LOGOUT';\n\nclass NavBar extends React.Component {\n constructor (props) {\n super(props);\n this.checkForLoggedInUser = this.checkForLoggedInUser.bind(this);\n this.logoutUser = this.logoutUser.bind(this);\n this.handleSelection = this.handleSelection.bind(this);\n }\n componentDidMount () {\n // check to see if the user is already logged in\n this.checkForLoggedInUser();\n }\n checkForLoggedInUser () {\n const params = {credentials: 'include'};\n request('/user', params)\n .then(({ data }) => {\n this.props.onChannelLogin(data.channelName, data.shortChannelId, data.channelClaimId);\n })\n .catch(error => {\n console.log('/user error:', error.message);\n });\n }\n logoutUser () {\n const params = {credentials: 'include'};\n request('/logout', params)\n .then(() => {\n this.props.onChannelLogout();\n })\n .catch(error => {\n console.log('/logout error', error.message);\n });\n }\n handleSelection (event) {\n const value = event.target.selectedOptions[0].value;\n switch (value) {\n case LOGOUT:\n this.logoutUser();\n break;\n case VIEW:\n // redirect to channel page\n this.props.history.push(`/${this.props.channelName}:${this.props.channelLongId}`);\n break;\n default:\n break;\n }\n }\n render () {\n return (\n
\n
\n \n
\n Open-source, decentralized image and video sharing.\n
\n
\n Publish\n About\n { this.props.channelName ? (\n \n ) : (\n Channel\n )}\n
\n
\n
\n );\n }\n}\n\nexport default withRouter(NavBar);\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/NavBar/view.jsx","import React from 'react';\nimport { Link } from 'react-router-dom';\n\nfunction Logo () {\n return (\n \n \n Logo\n Spee.ch logo\n \n \n \n Spee<h\n \n \n \n \n \n \n \n \n \n \n \n \n );\n};\n\nexport default Logo;\n\n\n\n// WEBPACK FOOTER //\n// ./react/components/Logo/index.jsx","import React from 'react';\n\nfunction NavBarChannelDropdown ({ channelName, handleSelection, defaultSelection, VIEW, LOGOUT }) {\n return (\n \n );\n};\n\nexport default NavBarChannelDropdown;\n\n\n\n// WEBPACK FOOTER //\n// ./react/components/NavBarChannelOptionsDropdown/index.jsx","module.exports = require(\"cross-fetch/polyfill\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"cross-fetch/polyfill\"\n// module id = 90\n// module chunks = 0","import {connect} from 'react-redux';\nimport View from './view';\n\nconst mapStateToProps = ({ publish }) => {\n return {\n file : publish.file,\n status: publish.status.status,\n };\n};\n\nexport default connect(mapStateToProps, null)(View);\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/PublishTool/index.js","import React from 'react';\nimport Dropzone from 'containers/Dropzone';\nimport PublishDetails from 'containers/PublishDetails';\nimport PublishStatus from 'containers/PublishStatus';\n\nclass PublishTool extends React.Component {\n render () {\n if (this.props.file) {\n if (this.props.status) {\n return (\n \n );\n } else {\n return ;\n }\n } else {\n return ;\n }\n }\n};\n\nexport default PublishTool;\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/PublishTool/view.jsx","import React from 'react';\nimport { validateFile } from 'utils/file';\nimport Preview from 'components/Preview';\n\nclass Dropzone extends React.Component {\n constructor (props) {\n super(props);\n this.state = {\n dragOver : false,\n mouseOver : false,\n dimPreview: false,\n };\n this.handleDrop = this.handleDrop.bind(this);\n this.handleDragOver = this.handleDragOver.bind(this);\n this.handleDragEnd = this.handleDragEnd.bind(this);\n this.handleDragEnter = this.handleDragEnter.bind(this);\n this.handleDragLeave = this.handleDragLeave.bind(this);\n this.handleMouseEnter = this.handleMouseEnter.bind(this);\n this.handleMouseLeave = this.handleMouseLeave.bind(this);\n this.handleClick = this.handleClick.bind(this);\n this.handleFileInput = this.handleFileInput.bind(this);\n this.chooseFile = this.chooseFile.bind(this);\n }\n handleDrop (event) {\n event.preventDefault();\n this.setState({dragOver: false});\n // if dropped items aren't files, reject them\n const dt = event.dataTransfer;\n if (dt.items) {\n if (dt.items[0].kind === 'file') {\n const droppedFile = dt.items[0].getAsFile();\n this.chooseFile(droppedFile);\n }\n }\n }\n handleDragOver (event) {\n event.preventDefault();\n }\n handleDragEnd (event) {\n var dt = event.dataTransfer;\n if (dt.items) {\n for (var i = 0; i < dt.items.length; i++) {\n dt.items.remove(i);\n }\n } else {\n event.dataTransfer.clearData();\n }\n }\n handleDragEnter () {\n this.setState({dragOver: true, dimPreview: true});\n }\n handleDragLeave () {\n this.setState({dragOver: false, dimPreview: false});\n }\n handleMouseEnter () {\n this.setState({mouseOver: true, dimPreview: true});\n }\n handleMouseLeave () {\n this.setState({mouseOver: false, dimPreview: false});\n }\n handleClick (event) {\n event.preventDefault();\n document.getElementById('file_input').click();\n }\n handleFileInput (event) {\n event.preventDefault();\n const fileList = event.target.files;\n this.chooseFile(fileList[0]);\n }\n chooseFile (file) {\n if (file) {\n try {\n validateFile(file); // validate the file's name, type, and size\n } catch (error) {\n return this.props.setFileError(error.message);\n }\n // stage it so it will be ready when the publish button is clicked\n this.props.selectFile(file);\n }\n }\n render () {\n return (\n
\n
\n \n
\n
\n {this.props.file ? (\n
\n \n
\n { this.state.dragOver ? (\n
\n

Drop it.

\n
\n ) : (\n null\n )}\n { this.state.mouseOver ? (\n
\n

{this.props.fileError}

\n

Drag & drop image or video here to publish

\n

OR

\n

CHOOSE FILE

\n
\n ) : (\n null\n )}\n
\n
\n ) : (\n
\n { this.state.dragOver ? (\n
\n

Drop it.

\n
\n ) : (\n
\n

{this.props.fileError}

\n

Drag & drop image or video here to publish

\n

OR

\n

CHOOSE FILE

\n
\n )}\n
\n )}\n
\n
\n );\n }\n};\n\nexport default Dropzone;\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/Dropzone/view.jsx","module.exports = {\n validateFile (file) {\n if (!file) {\n throw new Error('no file provided');\n }\n if (/'/.test(file.name)) {\n throw new Error('apostrophes are not allowed in the file name');\n }\n // validate size and type\n switch (file.type) {\n case 'image/jpeg':\n case 'image/jpg':\n case 'image/png':\n if (file.size > 10000000) {\n throw new Error('Sorry, images are limited to 10 megabytes.');\n }\n break;\n case 'image/gif':\n if (file.size > 50000000) {\n throw new Error('Sorry, GIFs are limited to 50 megabytes.');\n }\n break;\n case 'video/mp4':\n if (file.size > 50000000) {\n throw new Error('Sorry, videos are limited to 50 megabytes.');\n }\n break;\n default:\n throw new Error(file.type + ' is not a supported file type. Only, .jpeg, .png, .gif, and .mp4 files are currently supported.');\n }\n },\n};\n\n\n\n// WEBPACK FOOTER //\n// ./react/utils/file.js","import React from 'react';\nimport PropTypes from 'prop-types';\n\nclass Preview extends React.Component {\n constructor (props) {\n super(props);\n this.state = {\n imgSource : '',\n defaultThumbnail: '/assets/img/video_thumb_default.png',\n };\n }\n componentDidMount () {\n this.setPreviewImageSource(this.props.file);\n }\n componentWillReceiveProps (newProps) {\n if (newProps.file !== this.props.file) {\n this.setPreviewImageSource(newProps.file);\n }\n if (newProps.thumbnail !== this.props.thumbnail) {\n if (newProps.thumbnail) {\n this.setPreviewImageSourceFromFile(newProps.thumbnail);\n } else {\n this.setState({imgSource: this.state.defaultThumbnail});\n }\n }\n }\n setPreviewImageSourceFromFile (file) {\n const previewReader = new FileReader();\n previewReader.readAsDataURL(file);\n previewReader.onloadend = () => {\n this.setState({imgSource: previewReader.result});\n };\n }\n setPreviewImageSource (file) {\n if (file.type !== 'video/mp4') {\n this.setPreviewImageSourceFromFile(file);\n } else {\n if (this.props.thumbnail) {\n this.setPreviewImageSourceFromFile(this.props.thumbnail);\n }\n this.setState({imgSource: this.state.defaultThumbnail});\n }\n }\n render () {\n return (\n \n );\n }\n};\n\nPreview.propTypes = {\n dimPreview: PropTypes.bool.isRequired,\n file : PropTypes.object.isRequired,\n thumbnail : PropTypes.object,\n};\n\nexport default Preview;\n\n\n\n// WEBPACK FOOTER //\n// ./react/components/Preview/index.jsx","import {connect} from 'react-redux';\nimport {clearFile, startPublish} from 'actions/publish';\nimport View from './view';\n\nconst mapStateToProps = ({ channel, publish }) => {\n return {\n file: publish.file,\n };\n};\n\nconst mapDispatchToProps = {\n clearFile,\n startPublish,\n};\n\nexport default connect(mapStateToProps, mapDispatchToProps)(View);\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/PublishDetails/index.js","import React from 'react';\nimport { withRouter } from 'react-router-dom';\nimport Dropzone from 'containers/Dropzone';\nimport PublishTitleInput from 'containers/PublishTitleInput';\nimport PublishUrlInput from 'containers/PublishUrlInput';\nimport PublishThumbnailInput from 'containers/PublishThumbnailInput';\nimport PublishMetadataInputs from 'containers/PublishMetadataInputs';\nimport ChannelSelect from 'containers/ChannelSelect';\n\nclass PublishDetails extends React.Component {\n constructor (props) {\n super(props)\n this.onPublishSubmit = this.onPublishSubmit.bind(this);\n }\n onPublishSubmit () {\n this.props.startPublish(this.props.history);\n }\n render () {\n return (\n
\n
\n \n
\n {/* left column */}\n
\n
\n \n
\n
\n {/* right column */}\n
\n
\n
\n \n
\n
\n \n
\n { (this.props.file.type === 'video/mp4') && (\n
\n \n
\n )}\n
\n \n
\n
\n \n
\n
\n \n
\n
\n

By clicking 'Publish', you affirm that you have the rights to publish this content to the LBRY network, and that you understand the properties of publishing it to a decentralized, user-controlled network. Read more.

\n
\n
\n
\n
\n );\n }\n};\n\nexport default withRouter(PublishDetails);\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/PublishDetails/view.jsx","import {connect} from 'react-redux';\nimport {updateMetadata} from 'actions/publish';\nimport View from './view';\n\nconst mapStateToProps = ({ publish }) => {\n return {\n title: publish.metadata.title,\n };\n};\n\nconst mapDispatchToProps = dispatch => {\n return {\n onMetadataChange: (name, value) => {\n dispatch(updateMetadata(name, value));\n },\n };\n};\n\nexport default connect(mapStateToProps, mapDispatchToProps)(View);\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/PublishTitleInput/index.js","import React from 'react';\n\nclass PublishTitleInput extends React.Component {\n constructor (props) {\n super(props);\n this.handleInput = this.handleInput.bind(this);\n }\n handleInput (e) {\n const name = e.target.name;\n const value = e.target.value;\n this.props.onMetadataChange(name, value);\n }\n render () {\n return (\n \n );\n }\n}\n\nexport default PublishTitleInput;\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/PublishTitleInput/view.jsx","import {updateClaim, updateError} from 'actions/publish';\nimport {connect} from 'react-redux';\nimport View from './view';\n\nconst mapStateToProps = ({ channel, publish }) => {\n return {\n loggedInChannelName : channel.loggedInChannel.name,\n loggedInChannelShortId: channel.loggedInChannel.shortId,\n fileName : publish.file.name,\n publishInChannel : publish.publishInChannel,\n selectedChannel : publish.selectedChannel,\n claim : publish.claim,\n urlError : publish.error.url,\n };\n};\n\nconst mapDispatchToProps = dispatch => {\n return {\n onClaimChange: (value) => {\n dispatch(updateClaim(value));\n dispatch(updateError('publishSubmit', null));\n },\n onUrlError: (value) => {\n dispatch(updateError('url', value));\n },\n };\n};\n\nexport default connect(mapStateToProps, mapDispatchToProps)(View);\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/PublishUrlInput/index.js","import React from 'react';\nimport request from 'utils/request';\nimport UrlMiddle from 'components/PublishUrlMiddleDisplay';\n\nclass PublishUrlInput extends React.Component {\n constructor (props) {\n super(props);\n this.handleInput = this.handleInput.bind(this);\n }\n componentDidMount () {\n const { claim, fileName } = this.props;\n if (!claim) {\n this.setClaimName(fileName);\n }\n }\n componentWillReceiveProps ({ claim, fileName }) {\n // if a new file was chosen, update the claim name\n if (fileName !== this.props.fileName) {\n return this.setClaimName(fileName);\n }\n // if the claim has updated, check its availability\n if (claim !== this.props.claim) {\n this.validateClaim(claim);\n }\n }\n handleInput (event) {\n let value = event.target.value;\n value = this.cleanseInput(value);\n // update the state\n this.props.onClaimChange(value);\n }\n cleanseInput (input) {\n input = input.replace(/\\s+/g, '-'); // replace spaces with dashes\n input = input.replace(/[^A-Za-z0-9-]/g, ''); // remove all characters that are not A-Z, a-z, 0-9, or '-'\n return input;\n }\n setClaimName (fileName) {\n const fileNameWithoutEnding = fileName.substring(0, fileName.lastIndexOf('.'));\n const cleanClaimName = this.cleanseInput(fileNameWithoutEnding);\n this.props.onClaimChange(cleanClaimName);\n }\n validateClaim (claim) {\n if (!claim) {\n return this.props.onUrlError('Enter a url above');\n }\n request(`/api/claim/availability/${claim}`)\n .then(() => {\n this.props.onUrlError(null);\n })\n .catch((error) => {\n this.props.onUrlError(error.message);\n });\n }\n render () {\n const { claim, loggedInChannelName, loggedInChannelShortId, publishInChannel, selectedChannel, urlError } = this.props;\n return (\n
\n
\n spee.ch / \n \n \n { (claim && !urlError) && {'\\u2713'} }\n { urlError && {'\\u2716'} }\n
\n
\n { urlError ? (\n

{urlError}

\n ) : (\n

Choose a custom url

\n )}\n
\n
\n );\n }\n}\n\nexport default PublishUrlInput;\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/PublishUrlInput/view.jsx","import React from 'react';\nimport PropTypes from 'prop-types';\n\nfunction UrlMiddle ({publishInChannel, selectedChannel, loggedInChannelName, loggedInChannelShortId}) {\n if (publishInChannel) {\n if (selectedChannel === loggedInChannelName) {\n return {loggedInChannelName}:{loggedInChannelShortId} /;\n }\n return @channelSelect a channel below /;\n }\n return (\n xyzThis will be a random id /\n );\n}\n\nUrlMiddle.propTypes = {\n publishInChannel : PropTypes.bool.isRequired,\n loggedInChannelName : PropTypes.string,\n loggedInChannelShortId: PropTypes.string,\n};\n\nexport default UrlMiddle;\n\n\n\n// WEBPACK FOOTER //\n// ./react/components/PublishUrlMiddleDisplay/index.jsx","import { connect } from 'react-redux';\nimport { onNewThumbnail } from 'actions/publish';\nimport View from './view';\n\nconst mapStateToProps = ({ publish: { file } }) => {\n return {\n file,\n };\n};\n\nconst mapDispatchToProps = {\n onNewThumbnail,\n};\n\nexport default connect(mapStateToProps, mapDispatchToProps)(View);\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/PublishThumbnailInput/index.js","import React from 'react';\n\nfunction dataURItoBlob(dataURI) {\n // convert base64/URLEncoded data component to raw binary data held in a string\n let byteString = atob(dataURI.split(',')[1]);\n // separate out the mime component\n let mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0];\n // write the bytes of the string to a typed array\n let ia = new Uint8Array(byteString.length);\n for (let i = 0; i < byteString.length; i++) {\n ia[i] = byteString.charCodeAt(i);\n }\n return new Blob([ia], {type: mimeString});\n}\n\nclass PublishThumbnailInput extends React.Component {\n constructor (props) {\n super(props);\n this.state = {\n videoSource : null,\n error : null,\n sliderMinRange: 1,\n sliderMaxRange: null,\n sliderValue : null,\n };\n this.handleVideoLoadedData = this.handleVideoLoadedData.bind(this);\n this.handleSliderChange = this.handleSliderChange.bind(this);\n this.createThumbnail = this.createThumbnail.bind(this);\n }\n componentDidMount () {\n const { file } = this.props;\n this.setVideoSource(file);\n }\n componentWillReceiveProps (nextProps) {\n // if file changes\n if (nextProps.file && nextProps.file !== this.props.file) {\n const { file } = nextProps;\n this.setVideoSource(file);\n };\n }\n setVideoSource (file) {\n const previewReader = new FileReader();\n previewReader.readAsDataURL(file);\n previewReader.onloadend = () => {\n const dataUri = previewReader.result;\n const blob = dataURItoBlob(dataUri);\n const videoSource = URL.createObjectURL(blob);\n this.setState({ videoSource });\n };\n }\n handleVideoLoadedData (event) {\n const duration = event.target.duration;\n const totalMinutes = Math.floor(duration / 60);\n const totalSeconds = Math.floor(duration % 60);\n // set the slider\n this.setState({\n sliderMaxRange: duration * 100,\n sliderValue : duration * 100 / 2,\n totalMinutes,\n totalSeconds,\n });\n // update the current time of the video\n let video = document.getElementById('video-thumb-player');\n video.currentTime = duration / 2;\n }\n handleSliderChange (event) {\n const value = parseInt(event.target.value);\n // update the slider value\n this.setState({\n sliderValue: value,\n });\n // update the current time of the video\n let video = document.getElementById('video-thumb-player');\n video.currentTime = value / 100;\n }\n createThumbnail () {\n // take a snapshot\n let video = document.getElementById('video-thumb-player');\n let canvas = document.createElement('canvas');\n canvas.width = video.videoWidth;\n canvas.height = video.videoHeight;\n canvas.getContext('2d').drawImage(video, 0, 0, canvas.width, canvas.height);\n const dataUrl = canvas.toDataURL();\n const blob = dataURItoBlob(dataUrl);\n const snapshot = new File([blob], `thumbnail.png`, {\n type: 'image/png',\n });\n // set the thumbnail in redux store\n if (snapshot) {\n this.props.onNewThumbnail(snapshot);\n }\n }\n render () {\n const { error, videoSource, sliderMinRange, sliderMaxRange, sliderValue, totalMinutes, totalSeconds } = this.state;\n return (\n
\n \n \n {\n sliderValue ? (\n
\n
\n 0'00\"\n {totalMinutes}'{totalSeconds}\"\n
\n
\n \n
\n
\n ) : (\n

loading...

\n )\n }\n { error ? (\n

{error}

\n ) : (\n

Use slider to set thumbnail

\n )}\n
\n );\n }\n}\n\nexport default PublishThumbnailInput;\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/PublishThumbnailInput/view.jsx","import {connect} from 'react-redux';\nimport {updateMetadata, toggleMetadataInputs} from 'actions/publish';\nimport View from './view';\n\nconst mapStateToProps = ({ publish }) => {\n return {\n showMetadataInputs: publish.showMetadataInputs,\n description : publish.metadata.description,\n license : publish.metadata.license,\n nsfw : publish.metadata.nsfw,\n };\n};\n\nconst mapDispatchToProps = dispatch => {\n return {\n onMetadataChange: (name, value) => {\n dispatch(updateMetadata(name, value));\n },\n onToggleMetadataInputs: (value) => {\n dispatch(toggleMetadataInputs(value));\n },\n };\n};\n\nexport default connect(mapStateToProps, mapDispatchToProps)(View);\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/PublishMetadataInputs/index.js","import React from 'react';\nimport ExpandingTextArea from 'components/ExpandingTextArea';\n\nclass PublishMetadataInputs extends React.Component {\n constructor (props) {\n super(props);\n this.toggleShowInputs = this.toggleShowInputs.bind(this);\n this.handleInput = this.handleInput.bind(this);\n this.handleSelect = this.handleSelect.bind(this);\n }\n toggleShowInputs () {\n this.props.onToggleMetadataInputs(!this.props.showMetadataInputs);\n }\n handleInput (event) {\n const target = event.target;\n const value = target.type === 'checkbox' ? target.checked : target.value;\n const name = target.name;\n this.props.onMetadataChange(name, value);\n }\n handleSelect (event) {\n const name = event.target.name;\n const selectedOption = event.target.selectedOptions[0].value;\n this.props.onMetadataChange(name, selectedOption);\n }\n render () {\n return (\n
\n {this.props.showMetadataInputs && (\n
\n
\n
\n \n
\n \n
\n
\n\n
\n
\n \n
\n \n
\n
\n\n
\n
\n \n
\n \n
\n
\n
\n )}\n \n
\n );\n }\n}\n\nexport default PublishMetadataInputs;\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/PublishMetadataInputs/view.jsx","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\n\nclass ExpandingTextarea extends Component {\n constructor (props) {\n super(props);\n this._handleChange = this._handleChange.bind(this);\n }\n componentDidMount () {\n this.adjustTextarea({});\n }\n _handleChange (event) {\n const { onChange } = this.props;\n if (onChange) onChange(event);\n this.adjustTextarea(event);\n }\n adjustTextarea ({ target = this.el }) {\n target.style.height = 0;\n target.style.height = `${target.scrollHeight}px`;\n }\n render () {\n const { ...rest } = this.props;\n return (\n this.el = x}\n onChange={this._handleChange}\n />\n );\n }\n}\n\nExpandingTextarea.propTypes = {\n onChange: PropTypes.func,\n};\n\nexport default ExpandingTextarea;\n\n\n\n// WEBPACK FOOTER //\n// ./react/components/ExpandingTextArea/index.jsx","import {connect} from 'react-redux';\nimport {setPublishInChannel, updateSelectedChannel, updateError} from 'actions/publish';\nimport View from './view';\n\nconst mapStateToProps = ({ channel, publish }) => {\n return {\n loggedInChannelName: channel.loggedInChannel.name,\n publishInChannel : publish.publishInChannel,\n selectedChannel : publish.selectedChannel,\n channelError : publish.error.channel,\n };\n};\n\nconst mapDispatchToProps = dispatch => {\n return {\n onPublishInChannelChange: (value) => {\n dispatch(updateError('channel', null));\n dispatch(setPublishInChannel(value));\n },\n onChannelSelect: (value) => {\n dispatch(updateError('channel', null));\n dispatch(updateSelectedChannel(value));\n },\n };\n};\n\nexport default connect(mapStateToProps, mapDispatchToProps)(View);\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/ChannelSelect/index.js","import React from 'react';\nimport ChannelLoginForm from 'containers/ChannelLoginForm';\nimport ChannelCreateForm from 'containers/ChannelCreateForm';\nimport * as states from 'constants/publish_channel_select_states';\n\nclass ChannelSelect extends React.Component {\n constructor (props) {\n super(props);\n this.toggleAnonymousPublish = this.toggleAnonymousPublish.bind(this);\n this.handleSelection = this.handleSelection.bind(this);\n }\n toggleAnonymousPublish (event) {\n const value = event.target.value;\n if (value === 'anonymous') {\n this.props.onPublishInChannelChange(false);\n } else {\n this.props.onPublishInChannelChange(true);\n }\n }\n handleSelection (event) {\n const selectedOption = event.target.selectedOptions[0].value;\n this.props.onChannelSelect(selectedOption);\n }\n render () {\n return (\n
\n
\n
\n \n \n
\n
\n \n \n
\n { this.props.channelError ? (\n

{this.props.channelError}

\n ) : (\n

Publish anonymously or in a channel

\n )}\n
\n { this.props.publishInChannel && (\n
\n
\n \n
\n \n
\n { (this.props.selectedChannel === states.LOGIN) && }\n { (this.props.selectedChannel === states.CREATE) && }\n
\n )}\n
\n );\n }\n}\n\nexport default ChannelSelect;\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/ChannelSelect/view.jsx","import React from 'react';\nimport request from 'utils/request';\n\nclass ChannelLoginForm extends React.Component {\n constructor (props) {\n super(props);\n this.state = {\n error : null,\n name : '',\n password: '',\n };\n this.handleInput = this.handleInput.bind(this);\n this.loginToChannel = this.loginToChannel.bind(this);\n }\n handleInput (event) {\n const name = event.target.name;\n const value = event.target.value;\n this.setState({[name]: value});\n }\n loginToChannel (event) {\n event.preventDefault();\n const params = {\n method : 'POST',\n body : JSON.stringify({username: this.state.name, password: this.state.password}),\n headers: new Headers({\n 'Content-Type': 'application/json',\n }),\n credentials: 'include',\n };\n request('login', params)\n .then(({success, channelName, shortChannelId, channelClaimId, message}) => {\n if (success) {\n this.props.onChannelLogin(channelName, shortChannelId, channelClaimId);\n } else {\n this.setState({'error': message});\n };\n })\n .catch(error => {\n if (error.message) {\n this.setState({'error': error.message});\n } else {\n this.setState({'error': error});\n }\n });\n }\n render () {\n return (\n
\n
\n
\n \n
\n
\n @\n \n
\n
\n
\n
\n
\n \n
\n
\n \n
\n
\n
\n { this.state.error ? (\n

{this.state.error}

\n ) : (\n

Enter the name and password for your channel

\n )}\n
\n \n
\n
\n );\n }\n}\n\nexport default ChannelLoginForm;\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/ChannelLoginForm/view.jsx","import React from 'react';\nimport ProgressBar from 'components/ProgressBar';\nimport request from 'utils/request';\n\nclass ChannelCreateForm extends React.Component {\n constructor (props) {\n super(props);\n this.state = {\n error : null,\n channel : '',\n password: '',\n status : null,\n };\n this.handleChannelInput = this.handleChannelInput.bind(this);\n this.handleInput = this.handleInput.bind(this);\n this.createChannel = this.createChannel.bind(this);\n }\n cleanseChannelInput (input) {\n input = input.replace(/\\s+/g, '-'); // replace spaces with dashes\n input = input.replace(/[^A-Za-z0-9-]/g, ''); // remove all characters that are not A-Z, a-z, 0-9, or '-'\n return input;\n }\n handleChannelInput (event) {\n let value = event.target.value;\n value = this.cleanseChannelInput(value);\n this.setState({channel: value});\n if (value) {\n this.updateIsChannelAvailable(value);\n } else {\n this.setState({error: 'Please enter a channel name'});\n }\n }\n handleInput (event) {\n const name = event.target.name;\n const value = event.target.value;\n this.setState({[name]: value});\n }\n updateIsChannelAvailable (channel) {\n const channelWithAtSymbol = `@${channel}`;\n request(`/api/channel/availability/${channelWithAtSymbol}`)\n .then(isAvailable => {\n if (isAvailable) {\n this.setState({'error': null});\n } else {\n this.setState({'error': 'That channel has already been claimed'});\n }\n })\n .catch((error) => {\n this.setState({'error': error.message});\n });\n }\n checkIsChannelAvailable (channel) {\n const channelWithAtSymbol = `@${channel}`;\n return new Promise((resolve, reject) => {\n request(`/api/channel/availability/${channelWithAtSymbol}`)\n .then(isAvailable => {\n if (!isAvailable) {\n return reject(new Error('That channel has already been claimed'));\n }\n resolve();\n })\n .catch((error) => {\n reject(error);\n });\n });\n }\n checkIsPasswordProvided () {\n const password = this.state.password;\n return new Promise((resolve, reject) => {\n if (!password || password.length < 1) {\n return reject(new Error('Please provide a password'));\n }\n resolve();\n });\n }\n makePublishChannelRequest (username, password) {\n const params = {\n method : 'POST',\n body : JSON.stringify({username, password}),\n headers: new Headers({\n 'Content-Type': 'application/json',\n }),\n credentials: 'include',\n };\n return new Promise((resolve, reject) => {\n request('/signup', params)\n .then(result => {\n return resolve(result);\n })\n .catch(error => {\n reject(new Error(`Unfortunately, we encountered an error while creating your channel. Please let us know in Discord! ${error.message}`));\n });\n });\n }\n createChannel (event) {\n event.preventDefault();\n this.checkIsPasswordProvided()\n .then(() => {\n return this.checkIsChannelAvailable(this.state.channel, this.state.password);\n })\n .then(() => {\n this.setState({status: 'We are publishing your new channel. Sit tight...'});\n return this.makePublishChannelRequest(this.state.channel, this.state.password);\n })\n .then(result => {\n this.setState({status: null});\n this.props.onChannelLogin(result.channelName, result.shortChannelId, result.channelClaimId);\n })\n .catch((error) => {\n this.setState({'error': error.message, status: null});\n });\n }\n render () {\n return (\n
\n { !this.state.status ? (\n
\n
\n
\n \n
\n
\n @\n \n { (this.state.channel && !this.state.error) && {'\\u2713'} }\n { this.state.error && {'\\u2716'} }\n
\n
\n
\n
\n
\n \n
\n
\n \n
\n
\n
\n {this.state.error ? (\n

{this.state.error}

\n ) : (\n

Choose a name and password for your channel

\n )}\n
\n \n
\n
\n ) : (\n
\n

{this.state.status}

\n \n
\n )}\n
\n );\n }\n}\n\nexport default ChannelCreateForm;\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/ChannelCreateForm/view.jsx","import React from 'react';\n\nconst ActiveStatusBar = () => {\n return | ;\n};\n\nexport default ActiveStatusBar;\n\n\n\n// WEBPACK FOOTER //\n// ./react/components/ActiveStatusBar/index.jsx","import React from 'react';\n\nconst InactiveStatusBar = () => {\n return | ;\n};\n\nexport default InactiveStatusBar;\n\n\n\n// WEBPACK FOOTER //\n// ./react/components/InactiveStatusBar/index.jsx","import {connect} from 'react-redux';\nimport {clearFile} from 'actions/publish';\nimport View from './view';\n\nconst mapStateToProps = ({ publish }) => {\n return {\n status : publish.status.status,\n message: publish.status.message,\n };\n};\n\nconst mapDispatchToProps = {\n clearFile,\n};\n\nexport default connect(mapStateToProps, mapDispatchToProps)(View);\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/PublishStatus/index.js","import React from 'react';\nimport ProgressBar from 'components/ProgressBar';\nimport * as publishStates from 'constants/publish_claim_states';\n\nclass PublishStatus extends React.Component {\n render () {\n const { status, message, clearFile } = this.props;\n return (\n
\n {status === publishStates.LOAD_START &&\n
\n

File is loading to server

\n

0%

\n
\n }\n {status === publishStates.LOADING &&\n
\n
\n

File is loading to server

\n

{message}

\n
\n
\n }\n {status === publishStates.PUBLISHING &&\n
\n

Upload complete. Your file is now being published on the blockchain...

\n \n

Curious what magic is happening here? Learn more.

\n
\n }\n {status === publishStates.SUCCESS &&\n
\n

Your publish is complete! You are being redirected to it now.

\n

If you are not automatically redirected, click here.

\n
\n }\n {status === publishStates.FAILED &&\n
\n

Something went wrong...

\n

{message}

\n

For help, post the above error text in the #speech channel on the lbry discord

\n \n
\n }\n
\n );\n }\n};\n\nexport default PublishStatus;\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/PublishStatus/view.jsx","export const LOAD_START = 'LOAD_START';\nexport const LOADING = 'LOADING';\nexport const PUBLISHING = 'PUBLISHING';\nexport const SUCCESS = 'SUCCESS';\nexport const FAILED = 'FAILED';\n\n\n\n// WEBPACK FOOTER //\n// ./react/constants/publish_claim_states.js","import React from 'react';\nimport NavBar from 'containers/NavBar';\nimport SEO from 'components/SEO';\n\nclass AboutPage extends React.Component {\n render () {\n return (\n
\n \n \n
\n
\n
\n

Spee.ch is an open-source project. Please contribute to the existing site, or fork it and make your own.

\n

TWITTER

\n

GITHUB

\n

DISCORD CHANNEL

\n

DOCUMENTATION

\n
\n
\n
\n

Spee.ch is a media-hosting site that reads from and publishes content to the LBRY blockchain.

\n

Spee.ch is a hosting service, but with the added benefit that it stores your content on a decentralized network of computers -- the LBRY network. This means that your images are stored in multiple locations without a single point of failure.

\n

Contribute

\n

If you have an idea for your own spee.ch-like site on top of LBRY, fork our github repo and go to town!

\n

If you want to improve spee.ch, join our discord channel or solve one of our github issues.

\n
\n
\n
\n
\n );\n }\n};\n\nexport default AboutPage;\n\n\n\n// WEBPACK FOOTER //\n// ./react/components/AboutPage/index.jsx","import {connect} from 'react-redux';\nimport View from './view';\n\nconst mapStateToProps = ({ channel }) => {\n return {\n loggedInChannelName: channel.loggedInChannel.name,\n };\n};\n\nexport default connect(mapStateToProps, null)(View);\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/LoginPage/index.js","import React from 'react';\nimport { withRouter } from 'react-router-dom';\nimport SEO from 'components/SEO';\nimport NavBar from 'containers/NavBar';\nimport ChannelLoginForm from 'containers/ChannelLoginForm';\nimport ChannelCreateForm from 'containers/ChannelCreateForm';\n\nclass LoginPage extends React.Component {\n componentWillReceiveProps (newProps) {\n // re-route the user to the homepage if the user is logged in\n if (newProps.loggedInChannelName !== this.props.loggedInChannelName) {\n this.props.history.push(`/`);\n }\n }\n render () {\n return (\n
\n \n \n
\n
\n
\n

Channels allow you to publish and group content under an identity. You can create a channel for yourself, or share one with like-minded friends. You can create 1 channel, or 100, so whether you're documenting important events, or making a public repository for cat gifs (password: '1234'), try creating a channel for it!

\n
\n
\n
\n

Log in to an existing channel:

\n \n

Create a brand new channel:

\n \n
\n
\n
\n
\n );\n }\n};\n\nexport default withRouter(LoginPage);\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/LoginPage/view.jsx","import { connect } from 'react-redux';\nimport { onHandleShowPageUri } from 'actions/show';\nimport View from './view';\n\nconst mapStateToProps = ({ show }) => {\n return {\n error : show.request.error,\n requestType: show.request.type,\n };\n};\n\nconst mapDispatchToProps = {\n onHandleShowPageUri,\n};\n\nexport default connect(mapStateToProps, mapDispatchToProps)(View);\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/ShowPage/index.js","import React from 'react';\nimport ErrorPage from 'components/ErrorPage';\nimport ShowAssetLite from 'containers/ShowAssetLite';\nimport ShowAssetDetails from 'containers/ShowAssetDetails';\nimport ShowChannel from 'containers/ShowChannel';\n\nimport { CHANNEL, ASSET_LITE, ASSET_DETAILS } from 'constants/show_request_types';\n\nclass ShowPage extends React.Component {\n componentDidMount () {\n this.props.onHandleShowPageUri(this.props.match.params);\n }\n componentWillReceiveProps (nextProps) {\n if (nextProps.match.params !== this.props.match.params) {\n this.props.onHandleShowPageUri(nextProps.match.params);\n }\n }\n render () {\n const { error, requestType } = this.props;\n if (error) {\n return (\n \n );\n }\n switch (requestType) {\n case CHANNEL:\n return ;\n case ASSET_LITE:\n return ;\n case ASSET_DETAILS:\n return ;\n default:\n return

loading...

;\n }\n }\n};\n\nexport default ShowPage;\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/ShowPage/view.jsx","import { connect } from 'react-redux';\nimport View from './view';\n\nconst mapStateToProps = ({ show }) => {\n // select request info\n const requestId = show.request.id;\n // select asset info\n let asset;\n const request = show.requestList[requestId] || null;\n const assetList = show.assetList;\n if (request && assetList) {\n const assetKey = request.key; // note: just store this in the request\n asset = assetList[assetKey] || null;\n };\n // return props\n return {\n asset,\n };\n};\n\nexport default connect(mapStateToProps, null)(View);\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/ShowAssetLite/index.js","import React from 'react';\nimport SEO from 'components/SEO';\nimport { Link } from 'react-router-dom';\nimport AssetDisplay from 'containers/AssetDisplay';\n\nclass ShowLite extends React.Component {\n render () {\n const { asset } = this.props;\n if (asset) {\n const { name, claimId } = asset.claimData;\n return (\n
\n \n \n hosted\n via Spee.ch\n
\n );\n }\n return (\n
\n

loading asset data...

\n
\n );\n }\n};\n\nexport default ShowLite;\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/ShowAssetLite/view.jsx","import React from 'react';\nimport ProgressBar from 'components/ProgressBar';\nimport { LOCAL_CHECK, UNAVAILABLE, ERROR, AVAILABLE } from 'constants/asset_display_states';\n\nclass AssetDisplay extends React.Component {\n componentDidMount () {\n const { asset: { claimData: { name, claimId } } } = this.props;\n this.props.onFileRequest(name, claimId);\n }\n render () {\n const { status, error, asset: { claimData: { name, claimId, contentType, fileExt, thumbnail } } } = this.props;\n return (\n
\n {(status === LOCAL_CHECK) &&\n
\n

Checking to see if Spee.ch has your asset locally...

\n
\n }\n {(status === UNAVAILABLE) &&\n
\n

Sit tight, we're searching the LBRY blockchain for your asset!

\n \n

Curious what magic is happening here? Learn more.

\n
\n }\n {(status === ERROR) &&\n
\n

Unfortunately, we couldn't download your asset from LBRY. You can help us out by sharing the below error message in the LBRY discord.

\n

{error}

\n
\n }\n {(status === AVAILABLE) &&\n (() => {\n switch (contentType) {\n case 'image/jpeg':\n case 'image/jpg':\n case 'image/png':\n return (\n \n );\n case 'image/gif':\n return (\n \n );\n case 'video/mp4':\n return (\n \n );\n default:\n return (\n

Unsupported file type

\n );\n }\n })()\n }\n
\n );\n }\n};\n\nexport default AssetDisplay;\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/AssetDisplay/view.jsx","import { connect } from 'react-redux';\nimport View from './view';\n\nconst mapStateToProps = ({ show }) => {\n // select request info\n const requestId = show.request.id;\n // select asset info\n let asset;\n const request = show.requestList[requestId] || null;\n const assetList = show.assetList;\n if (request && assetList) {\n const assetKey = request.key; // note: just store this in the request\n asset = assetList[assetKey] || null;\n };\n // return props\n return {\n asset,\n };\n};\n\nexport default connect(mapStateToProps, null)(View);\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/ShowAssetDetails/index.js","import React from 'react';\nimport SEO from 'components/SEO';\nimport NavBar from 'containers/NavBar';\nimport ErrorPage from 'components/ErrorPage';\nimport AssetTitle from 'containers/AssetTitle';\nimport AssetDisplay from 'containers/AssetDisplay';\nimport AssetInfo from 'containers/AssetInfo';\n\nclass ShowAssetDetails extends React.Component {\n render () {\n const { asset } = this.props;\n if (asset) {\n const { claimData: { name } } = asset;\n return (\n
\n \n \n
\n
\n \n
\n
\n
\n \n
\n
\n
\n \n
\n
\n
\n }\n
\n );\n };\n return (\n \n );\n }\n};\n\nexport default ShowAssetDetails;\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/ShowAssetDetails/view.jsx","import { connect } from 'react-redux';\nimport View from './view';\nimport { selectAsset } from 'selectors/show';\n\nconst mapStateToProps = ({ show }) => {\n const { claimData: { title } } = selectAsset(show);\n return {\n title,\n };\n};\n\nexport default connect(mapStateToProps, null)(View);\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/AssetTitle/index.js","import React from 'react';\n\nconst AssetTitle = ({ title }) => {\n return (\n
\n {title}\n
\n );\n};\n\nexport default AssetTitle;\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/AssetTitle/view.jsx","import { connect } from 'react-redux';\nimport View from './view';\nimport { selectAsset } from 'selectors/show';\n\nconst mapStateToProps = ({ show }) => {\n // select asset\n const asset = selectAsset(show);\n // return props\n return {\n asset,\n };\n};\n\nexport default connect(mapStateToProps, null)(View);\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/AssetInfo/index.js","import React from 'react';\nimport { Link } from 'react-router-dom';\n\nclass AssetInfo extends React.Component {\n constructor (props) {\n super(props);\n this.copyToClipboard = this.copyToClipboard.bind(this);\n }\n copyToClipboard (event) {\n var elementToCopy = event.target.dataset.elementtocopy;\n var element = document.getElementById(elementToCopy);\n element.select();\n try {\n document.execCommand('copy');\n } catch (err) {\n this.setState({error: 'Oops, unable to copy'});\n }\n }\n render () {\n const { asset: { shortId, claimData : { channelName, certificateId, description, name, claimId, fileExt, contentType, thumbnail, host } } } = this.props;\n return (\n
\n {channelName &&\n
\n
\n Channel:\n
\n
\n {channelName}\n
\n
\n }\n\n {description &&\n
\n {description}\n
\n }\n\n
\n
\n
\n Share:\n
\n
\n \n twitter\n facebook\n tumblr\n reddit\n
\n
\n
\n
\n\n
\n \n );\n }\n};\n\nexport default AssetInfo;\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/AssetInfo/view.jsx","import { connect } from 'react-redux';\nimport View from './view';\n\nconst mapStateToProps = ({ show }) => {\n // select request info\n const requestId = show.request.id;\n // select request\n const previousRequest = show.requestList[requestId] || null;\n // select channel\n let channel;\n if (previousRequest) {\n const channelKey = previousRequest.key;\n channel = show.channelList[channelKey] || null;\n }\n return {\n channel,\n };\n};\n\nexport default connect(mapStateToProps, null)(View);\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/ShowChannel/index.js","import React from 'react';\nimport SEO from 'components/SEO';\nimport ErrorPage from 'components/ErrorPage';\nimport NavBar from 'containers/NavBar';\nimport ChannelClaimsDisplay from 'containers/ChannelClaimsDisplay';\n\nclass ShowChannel extends React.Component {\n render () {\n const { channel } = this.props;\n if (channel) {\n const { name, longId, shortId } = channel;\n return (\n
\n \n \n
\n
\n

channel name: {name}

\n

full channel id: {longId}

\n

short channel id: {shortId}

\n
\n
\n \n
\n
\n
\n );\n };\n return (\n \n );\n }\n};\n\nexport default ShowChannel;\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/ShowChannel/view.jsx","import { connect } from 'react-redux';\nimport { onUpdateChannelClaims } from 'actions/show';\nimport View from './view';\n\nconst mapStateToProps = ({ show }) => {\n // select channel key\n const request = show.requestList[show.request.id];\n const channelKey = request.key;\n // select channel claims\n const channel = show.channelList[channelKey] || null;\n // return props\n return {\n channelKey,\n channel,\n };\n};\n\nconst mapDispatchToProps = {\n onUpdateChannelClaims,\n};\n\nexport default connect(mapStateToProps, mapDispatchToProps)(View);\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/ChannelClaimsDisplay/index.js","import React from 'react';\nimport AssetPreview from 'components/AssetPreview';\n\nclass ChannelClaimsDisplay extends React.Component {\n constructor (props) {\n super(props);\n this.showNextResultsPage = this.showNextResultsPage.bind(this);\n this.showPreviousResultsPage = this.showPreviousResultsPage.bind(this);\n }\n showPreviousResultsPage () {\n const { channel: { claimsData: { currentPage } } } = this.props;\n const previousPage = parseInt(currentPage) - 1;\n this.showNewPage(previousPage);\n }\n showNextResultsPage () {\n const { channel: { claimsData: { currentPage } } } = this.props;\n const nextPage = parseInt(currentPage) + 1;\n this.showNewPage(nextPage);\n }\n showNewPage (page) {\n const { channelKey, channel: { name, longId } } = this.props;\n this.props.onUpdateChannelClaims(channelKey, name, longId, page);\n }\n render () {\n const { channel: { claimsData: { claims, currentPage, totalPages } } } = this.props;\n return (\n
\n {(claims.length > 0) ? (\n
\n {claims.map((claim, index) => )}\n
\n {(currentPage > 1) &&\n \n }\n {(currentPage < totalPages) &&\n \n }\n
\n
\n ) : (\n

There are no claims in this channel

\n )}\n
\n );\n }\n};\n\nexport default ChannelClaimsDisplay;\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/ChannelClaimsDisplay/view.jsx","import React from 'react';\nimport { Link } from 'react-router-dom';\nconst { claim: { defaultThumbnail } } = require('../../../config/speechConfig.js');\n\nconst AssetPreview = ({ claimData: { name, claimId, fileExt, contentType, thumbnail } }) => {\n const directSourceLink = `${claimId}/${name}.${fileExt}`;\n const showUrlLink = `/${claimId}/${name}`;\n return (\n
\n \n {(() => {\n switch (contentType) {\n case 'image/jpeg':\n case 'image/jpg':\n case 'image/png':\n case 'image/gif':\n return (\n \n );\n case 'video/mp4':\n return (\n \n );\n default:\n return (\n

unsupported file type

\n );\n }\n })()}\n \n
\n );\n};\n\nexport default AssetPreview;\n\n\n\n// WEBPACK FOOTER //\n// ./react/components/AssetPreview/index.jsx","import React from 'react';\nimport NavBar from 'containers/NavBar';\nimport Helmet from 'react-helmet';\nconst { site: { title, host } } = require('../../../config/speechConfig.js');\n\nclass FourOhForPage extends React.Component {\n render () {\n return (\n
\n \n {title} - 404\n \n \n \n
\n

404

\n

That page does not exist

\n
\n
\n );\n }\n};\n\nexport default FourOhForPage;\n\n\n\n// WEBPACK FOOTER //\n// ./react/components/FourOhFourPage/index.jsx","const { sendGAServeEvent } = require('../helpers/googleAnalytics');\nconst { determineResponseType, flipClaimNameAndIdForBackwardsCompatibility, logRequestData, getClaimIdAndServeAsset } = require('../helpers/serveHelpers.js');\nconst lbryUri = require('../helpers/lbryUri.js');\nconst handleShowRender = require('../helpers/handleShowRender.jsx');\nconst SERVE = 'SERVE';\n\nmodule.exports = (app) => {\n // route to serve a specific asset using the channel or claim id\n app.get('/:identifier/:claim', (req, res) => {\n const { headers, ip, originalUrl, params } = req;\n // decide if this is a show request\n let hasFileExtension;\n try {\n ({ hasFileExtension } = lbryUri.parseModifier(params.claim));\n } catch (error) {\n return res.status(400).json({success: false, message: error.message});\n }\n let responseType = determineResponseType(hasFileExtension, headers);\n if (responseType !== SERVE) {\n return handleShowRender(req, res);\n }\n // handle serve request\n // send google analytics\n sendGAServeEvent(headers, ip, originalUrl);\n // parse the claim\n let claimName;\n try {\n ({ claimName } = lbryUri.parseClaim(params.claim));\n } catch (error) {\n return res.status(400).json({success: false, message: error.message});\n }\n // parse the identifier\n let isChannel, channelName, channelClaimId, claimId;\n try {\n ({ isChannel, channelName, channelClaimId, claimId } = lbryUri.parseIdentifier(params.identifier));\n } catch (error) {\n return res.status(400).json({success: false, message: error.message});\n }\n if (!isChannel) {\n [claimId, claimName] = flipClaimNameAndIdForBackwardsCompatibility(claimId, claimName);\n }\n // log the request data for debugging\n logRequestData(responseType, claimName, channelName, claimId);\n // get the claim Id and then serve the asset\n getClaimIdAndServeAsset(channelName, channelClaimId, claimName, claimId, originalUrl, ip, res);\n });\n // route to serve the winning asset at a claim or a channel page\n app.get('/:claim', (req, res) => {\n const { headers, ip, originalUrl, params } = req;\n // decide if this is a show request\n let hasFileExtension;\n try {\n ({ hasFileExtension } = lbryUri.parseModifier(params.claim));\n } catch (error) {\n return res.status(400).json({success: false, message: error.message});\n }\n let responseType = determineResponseType(hasFileExtension, headers);\n if (responseType !== SERVE) {\n return handleShowRender(req, res);\n }\n // handle serve request\n // send google analytics\n sendGAServeEvent(headers, ip, originalUrl);\n // parse the claim\n let claimName;\n try {\n ({claimName} = lbryUri.parseClaim(params.claim));\n } catch (error) {\n return res.status(400).json({success: false, message: error.message});\n }\n // log the request data for debugging\n logRequestData(responseType, claimName, null, null);\n // get the claim Id and then serve the asset\n getClaimIdAndServeAsset(null, null, claimName, null, originalUrl, ip, res);\n });\n};\n\n\n\n// WEBPACK FOOTER //\n// ./routes/serve-routes.js","const logger = require('winston');\nconst { getClaimId, getLocalFileRecord } = require('../controllers/serveController.js');\nconst { handleErrorResponse } = require('../helpers/errorHandlers.js');\n\nconst SERVE = 'SERVE';\nconst SHOW = 'SHOW';\nconst NO_FILE = 'NO_FILE';\nconst NO_CHANNEL = 'NO_CHANNEL';\nconst NO_CLAIM = 'NO_CLAIM';\n\nfunction clientAcceptsHtml ({accept}) {\n return accept && accept.match(/text\\/html/);\n};\n\nfunction requestIsFromBrowser (headers) {\n return headers['user-agent'] && headers['user-agent'].match(/Mozilla/);\n};\n\nfunction clientWantsAsset ({accept, range}) {\n const imageIsWanted = accept && accept.match(/image\\/.*/) && !accept.match(/text\\/html/) && !accept.match(/text\\/\\*/);\n const videoIsWanted = accept && range;\n return imageIsWanted || videoIsWanted;\n};\n\nfunction isValidClaimId (claimId) {\n return ((claimId.length === 40) && !/[^A-Za-z0-9]/g.test(claimId));\n};\n\nfunction isValidShortId (claimId) {\n return claimId.length === 1; // it should really evaluate the short url itself\n};\n\nfunction isValidShortIdOrClaimId (input) {\n return (isValidClaimId(input) || isValidShortId(input));\n};\n\nfunction serveAssetToClient (claimId, name, res) {\n return getLocalFileRecord(claimId, name)\n .then(fileRecord => {\n // check that a local record was found\n if (fileRecord === NO_FILE) {\n return res.status(307).redirect(`/api/claim/get/${name}/${claimId}`);\n }\n // serve the file\n const {filePath, fileType} = fileRecord;\n logger.verbose(`serving file: ${filePath}`);\n const sendFileOptions = {\n headers: {\n 'X-Content-Type-Options': 'nosniff',\n 'Content-Type' : fileType || 'image/jpeg',\n },\n };\n res.status(200).sendFile(filePath, sendFileOptions);\n })\n .catch(error => {\n throw error;\n });\n};\n\nmodule.exports = {\n getClaimIdAndServeAsset (channelName, channelClaimId, claimName, claimId, originalUrl, ip, res) {\n // get the claim Id and then serve the asset\n getClaimId(channelName, channelClaimId, claimName, claimId)\n .then(fullClaimId => {\n if (fullClaimId === NO_CLAIM) {\n return res.status(404).json({success: false, message: 'no claim id could be found'});\n } else if (fullClaimId === NO_CHANNEL) {\n return res.status(404).json({success: false, message: 'no channel id could be found'});\n }\n serveAssetToClient(fullClaimId, claimName, res);\n // postToStats(responseType, originalUrl, ip, claimName, fullClaimId, 'success');\n })\n .catch(error => {\n handleErrorResponse(originalUrl, ip, error, res);\n // postToStats(responseType, originalUrl, ip, claimName, fullClaimId, 'fail');\n });\n },\n determineResponseType (hasFileExtension, headers) {\n let responseType;\n if (hasFileExtension) {\n responseType = SERVE; // assume a serve request if file extension is present\n if (clientAcceptsHtml(headers)) { // if the request comes from a browser, change it to a show request\n responseType = SHOW;\n }\n } else {\n responseType = SHOW;\n if (clientWantsAsset(headers) && requestIsFromBrowser(headers)) { // this is in case someone embeds a show url\n logger.debug('Show request came from browser but wants an image/video. Changing response to serve...');\n responseType = SERVE;\n }\n }\n return responseType;\n },\n flipClaimNameAndIdForBackwardsCompatibility (identifier, name) {\n // this is a patch for backwards compatability with '/name/claim_id' url format\n if (isValidShortIdOrClaimId(name) && !isValidShortIdOrClaimId(identifier)) {\n const tempName = name;\n name = identifier;\n identifier = tempName;\n }\n return [identifier, name];\n },\n logRequestData (responseType, claimName, channelName, claimId) {\n logger.debug('responseType ===', responseType);\n logger.debug('claim name === ', claimName);\n logger.debug('channel name ===', channelName);\n logger.debug('claim id ===', claimId);\n },\n};\n\n\n\n// WEBPACK FOOTER //\n// ./helpers/serveHelpers.js","const logger = require('winston');\n\nmodule.exports = {\n REGEXP_INVALID_CLAIM : /[^A-Za-z0-9-]/g,\n REGEXP_INVALID_CHANNEL: /[^A-Za-z0-9-@]/g,\n REGEXP_ADDRESS : /^b(?=[^0OIl]{32,33})[0-9A-Za-z]{32,33}$/,\n CHANNEL_CHAR : '@',\n parseIdentifier : function (identifier) {\n logger.debug('parsing identifier:', identifier);\n const componentsRegex = new RegExp(\n '([^:$#/]*)' + // value (stops at the first separator or end)\n '([:$#]?)([^/]*)' // modifier separator, modifier (stops at the first path separator or end)\n );\n const [proto, value, modifierSeperator, modifier] = componentsRegex\n .exec(identifier)\n .map(match => match || null);\n logger.debug(`${proto}, ${value}, ${modifierSeperator}, ${modifier}`);\n\n // Validate and process name\n if (!value) {\n throw new Error(`Check your url. No channel name provided before \"${modifierSeperator}\"`);\n }\n const isChannel = value.startsWith(module.exports.CHANNEL_CHAR);\n const channelName = isChannel ? value : null;\n let claimId;\n if (isChannel) {\n if (!channelName) {\n throw new Error('No channel name after @.');\n }\n const nameBadChars = (channelName).match(module.exports.REGEXP_INVALID_CHANNEL);\n if (nameBadChars) {\n throw new Error(`Invalid characters in channel name: ${nameBadChars.join(', ')}.`);\n }\n } else {\n claimId = value;\n }\n\n // Validate and process modifier\n let channelClaimId;\n if (modifierSeperator) {\n if (!modifier) {\n throw new Error(`No modifier provided after separator \"${modifierSeperator}\"`);\n }\n\n if (modifierSeperator === ':') {\n channelClaimId = modifier;\n } else {\n throw new Error(`The \"${modifierSeperator}\" modifier is not currently supported`);\n }\n }\n return {\n isChannel,\n channelName,\n channelClaimId,\n claimId,\n };\n },\n parseClaim: function (claim) {\n logger.debug('parsing name:', claim);\n const componentsRegex = new RegExp(\n '([^:$#/.]*)' + // name (stops at the first modifier)\n '([:$#.]?)([^/]*)' // modifier separator, modifier (stops at the first path separator or end)\n );\n const [proto, claimName, modifierSeperator, modifier] = componentsRegex\n .exec(claim)\n .map(match => match || null);\n logger.debug(`${proto}, ${claimName}, ${modifierSeperator}, ${modifier}`);\n\n // Validate and process name\n if (!claimName) {\n throw new Error('No claim name provided before .');\n }\n const nameBadChars = (claimName).match(module.exports.REGEXP_INVALID_CLAIM);\n if (nameBadChars) {\n throw new Error(`Invalid characters in claim name: ${nameBadChars.join(', ')}.`);\n }\n // Validate and process modifier\n if (modifierSeperator) {\n if (!modifier) {\n throw new Error(`No file extension provided after separator ${modifierSeperator}.`);\n }\n if (modifierSeperator !== '.') {\n throw new Error(`The ${modifierSeperator} modifier is not supported in the claim name`);\n }\n }\n // return results\n return {\n claimName,\n };\n },\n parseModifier: function (claim) {\n logger.debug('parsing modifier:', claim);\n const componentsRegex = new RegExp(\n '([^:$#/.]*)' + // name (stops at the first modifier)\n '([:$#.]?)([^/]*)' // modifier separator, modifier (stops at the first path separator or end)\n );\n const [proto, claimName, modifierSeperator, modifier] = componentsRegex\n .exec(claim)\n .map(match => match || null);\n logger.debug(`${proto}, ${claimName}, ${modifierSeperator}, ${modifier}`);\n // Validate and process modifier\n let hasFileExtension = false;\n if (modifierSeperator) {\n hasFileExtension = true;\n }\n return {\n hasFileExtension,\n };\n },\n};\n\n\n\n// WEBPACK FOOTER //\n// ./helpers/lbryUri.js","import React from 'react';\nimport { renderToString } from 'react-dom/server';\nimport { createStore, applyMiddleware } from 'redux';\nimport Reducer from '../react/reducers';\nimport { Provider } from 'react-redux';\nimport { StaticRouter } from 'react-router-dom';\nimport GAListener from '../react/components/GAListener';\nimport App from '../react/app';\nimport renderFullPage from './renderFullPage';\nimport createSagaMiddleware from 'redux-saga';\nimport { call } from 'redux-saga/effects';\nimport { handleShowPageUri } from '../react/sagas/show_uri';\nimport { onHandleShowPageUri } from '../react/actions/show';\n\nimport Helmet from 'react-helmet';\n\nconst returnSagaWithParams = (saga, params) => {\n return function * () {\n yield call(saga, params);\n };\n};\n\nmodule.exports = (req, res) => {\n let context = {};\n\n // create and apply middleware\n const sagaMiddleware = createSagaMiddleware();\n const middleware = applyMiddleware(sagaMiddleware);\n\n // create a new Redux store instance\n const store = createStore(Reducer, middleware);\n\n // create saga\n const action = onHandleShowPageUri(req.params);\n const saga = returnSagaWithParams(handleShowPageUri, action);\n\n // run the saga middleware\n sagaMiddleware\n .run(saga)\n .done\n .then(() => {\n // render component to a string\n const html = renderToString(\n \n \n \n \n \n \n \n );\n\n // get head tags from helmet\n const helmet = Helmet.renderStatic();\n\n // check for a redirect\n if (context.url) {\n return res.redirect(301, context.url);\n }\n\n // get the initial state from our Redux store\n const preloadedState = store.getState();\n\n // send the rendered page back to the client\n res.send(renderFullPage(helmet, html, preloadedState));\n });\n};\n\n\n\n// WEBPACK FOOTER //\n// ./helpers/handleShowRender.jsx","module.exports = require(\"redux-saga\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"redux-saga\"\n// module id = 141\n// module chunks = 0","import { call, put, takeLatest } from 'redux-saga/effects';\nimport * as actions from 'constants/show_action_types';\nimport { onRequestError, onNewChannelRequest, onNewAssetRequest } from 'actions/show';\nimport { newAssetRequest } from 'sagas/show_asset';\nimport { newChannelRequest } from 'sagas/show_channel';\nimport lbryUri from 'utils/lbryUri';\n\nfunction * parseAndUpdateIdentifierAndClaim (modifier, claim) {\n // this is a request for an asset\n // claim will be an asset claim\n // the identifier could be a channel or a claim id\n let isChannel, channelName, channelClaimId, claimId, claimName, extension;\n try {\n ({ isChannel, channelName, channelClaimId, claimId } = lbryUri.parseIdentifier(modifier));\n ({ claimName, extension } = lbryUri.parseClaim(claim));\n } catch (error) {\n return yield put(onRequestError(error.message));\n }\n // trigger an new action to update the store\n if (isChannel) {\n return yield call(newAssetRequest, onNewAssetRequest(claimName, null, channelName, channelClaimId, extension));\n };\n yield call(newAssetRequest, onNewAssetRequest(claimName, claimId, null, null, extension));\n}\nfunction * parseAndUpdateClaimOnly (claim) {\n // this could be a request for an asset or a channel page\n // claim could be an asset claim or a channel claim\n let isChannel, channelName, channelClaimId;\n try {\n ({ isChannel, channelName, channelClaimId } = lbryUri.parseIdentifier(claim));\n } catch (error) {\n return yield put(onRequestError(error.message));\n }\n // trigger an new action to update the store\n // return early if this request is for a channel\n if (isChannel) {\n return yield call(newChannelRequest, onNewChannelRequest(channelName, channelClaimId));\n }\n // if not for a channel, parse the claim request\n let claimName, extension;\n try {\n ({claimName, extension} = lbryUri.parseClaim(claim));\n } catch (error) {\n return yield put(onRequestError(error.message));\n }\n yield call(newAssetRequest, onNewAssetRequest(claimName, null, null, null, extension));\n}\n\nexport function * handleShowPageUri (action) {\n const { identifier, claim } = action.data;\n if (identifier) {\n return yield call(parseAndUpdateIdentifierAndClaim, identifier, claim);\n }\n yield call(parseAndUpdateClaimOnly, claim);\n};\n\nexport function * watchHandleShowPageUri () {\n yield takeLatest(actions.HANDLE_SHOW_URI, handleShowPageUri);\n};\n\n\n\n// WEBPACK FOOTER //\n// ./react/sagas/show_uri.js","import { call, put, select, takeLatest } from 'redux-saga/effects';\nimport * as actions from 'constants/show_action_types';\nimport { addRequestToRequestList, onRequestError, onRequestUpdate, addAssetToAssetList } from 'actions/show';\nimport { getLongClaimId, getShortId, getClaimData } from 'api/assetApi';\nimport { selectShowState } from 'selectors/show';\n\nexport function * newAssetRequest (action) {\n const { requestType, requestId, name, modifier } = action.data;\n // put an action to update the request in redux\n yield put(onRequestUpdate(requestType, requestId));\n // is this an existing request?\n // If this uri is in the request list, it's already been fetched\n const state = yield select(selectShowState);\n if (state.requestList[requestId]) {\n return null;\n }\n // get long id && add request to request list\n let longId;\n try {\n ({data: longId} = yield call(getLongClaimId, name, modifier));\n } catch (error) {\n return yield put(onRequestError(error.message));\n }\n const assetKey = `a#${name}#${longId}`;\n yield put(addRequestToRequestList(requestId, null, assetKey));\n // is this an existing asset?\n // If this asset is in the asset list, it's already been fetched\n if (state.assetList[assetKey]) {\n return null;\n }\n // get short Id\n let shortId;\n try {\n ({data: shortId} = yield call(getShortId, name, longId));\n } catch (error) {\n return yield put(onRequestError(error.message));\n }\n // get asset claim data\n let claimData;\n try {\n ({data: claimData} = yield call(getClaimData, name, longId));\n } catch (error) {\n return yield put(onRequestError(error.message));\n }\n // add asset to asset list\n yield put(addAssetToAssetList(assetKey, null, name, longId, shortId, claimData));\n // clear any errors in request error\n yield put(onRequestError(null));\n};\n\nexport function * watchNewAssetRequest () {\n yield takeLatest(actions.ASSET_REQUEST_NEW, newAssetRequest);\n};\n\n\n\n// WEBPACK FOOTER //\n// ./react/sagas/show_asset.js","import Request from 'utils/request';\nconst { site: { host } } = require('../../config/speechConfig.js');\n\nexport function getLongClaimId (name, modifier) {\n let body = {};\n // create request params\n if (modifier) {\n if (modifier.id) {\n body['claimId'] = modifier.id;\n } else {\n body['channelName'] = modifier.channel.name;\n body['channelClaimId'] = modifier.channel.id;\n }\n }\n body['claimName'] = name;\n const params = {\n method : 'POST',\n headers: { 'Content-Type': 'application/json' },\n body : JSON.stringify(body),\n };\n // create url\n const url = `${host}/api/claim/long-id`;\n // return the request promise\n return Request(url, params);\n};\n\nexport function getShortId (name, claimId) {\n const url = `${host}/api/claim/short-id/${claimId}/${name}`;\n return Request(url);\n};\n\nexport function getClaimData (name, claimId) {\n const url = `${host}/api/claim/data/${name}/${claimId}`;\n return Request(url);\n};\n\n\n\n// WEBPACK FOOTER //\n// ./react/api/assetApi.js","import {call, put, select, takeLatest} from 'redux-saga/effects';\nimport * as actions from 'constants/show_action_types';\nimport { addNewChannelToChannelList, addRequestToRequestList, onRequestError, onRequestUpdate, updateChannelClaims } from 'actions/show';\nimport { getChannelClaims, getChannelData } from 'api/channelApi';\nimport { selectShowState } from 'selectors/show';\n\nexport function * newChannelRequest (action) {\n const { requestType, requestId, channelName, channelId } = action.data;\n // put an action to update the request in redux\n yield put(onRequestUpdate(requestType, requestId));\n // is this an existing request?\n // If this uri is in the request list, it's already been fetched\n const state = yield select(selectShowState);\n if (state.requestList[requestId]) {\n return null;\n }\n // get channel long id\n let longId, shortId;\n try {\n ({ data: {longChannelClaimId: longId, shortChannelClaimId: shortId} } = yield call(getChannelData, channelName, channelId));\n } catch (error) {\n return yield put(onRequestError(error.message));\n }\n // store the request in the channel requests list\n const channelKey = `c#${channelName}#${longId}`;\n yield put(addRequestToRequestList(requestId, null, channelKey));\n // is this an existing channel?\n // If this channel is in the channel list, it's already been fetched\n if (state.channelList[channelKey]) {\n return null;\n }\n // get channel claims data\n let claimsData;\n try {\n ({ data: claimsData } = yield call(getChannelClaims, channelName, longId, 1));\n } catch (error) {\n return yield put(onRequestError(error.message));\n }\n // store the channel data in the channel list\n yield put(addNewChannelToChannelList(channelKey, channelName, shortId, longId, claimsData));\n // clear any request errors\n yield put(onRequestError(null));\n}\n\nexport function * watchNewChannelRequest () {\n yield takeLatest(actions.CHANNEL_REQUEST_NEW, newChannelRequest);\n};\n\nfunction * getNewClaimsAndUpdateChannel (action) {\n const { channelKey, name, longId, page } = action.data;\n let claimsData;\n try {\n ({ data: claimsData } = yield call(getChannelClaims, name, longId, page));\n } catch (error) {\n return yield put(onRequestError(error.message));\n }\n yield put(updateChannelClaims(channelKey, claimsData));\n}\n\nexport function * watchUpdateChannelClaims () {\n yield takeLatest(actions.CHANNEL_CLAIMS_UPDATE_ASYNC, getNewClaimsAndUpdateChannel);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./react/sagas/show_channel.js","import Request from 'utils/request';\nconst { site: { host } } = require('../../config/speechConfig.js');\n\nexport function getChannelData (name, id) {\n if (!id) id = 'none';\n const url = `${host}/api/channel/data/${name}/${id}`;\n return Request(url);\n};\n\nexport function getChannelClaims (name, longId, page) {\n if (!page) page = 1;\n const url = `${host}/api/channel/claims/${name}/${longId}/${page}`;\n return Request(url);\n};\n\n\n\n// WEBPACK FOOTER //\n// ./react/api/channelApi.js","module.exports = {\n REGEXP_INVALID_CLAIM : /[^A-Za-z0-9-]/g,\n REGEXP_INVALID_CHANNEL: /[^A-Za-z0-9-@]/g,\n REGEXP_ADDRESS : /^b(?=[^0OIl]{32,33})[0-9A-Za-z]{32,33}$/,\n CHANNEL_CHAR : '@',\n parseIdentifier : function (identifier) {\n const componentsRegex = new RegExp(\n '([^:$#/]*)' + // value (stops at the first separator or end)\n '([:$#]?)([^/]*)' // modifier separator, modifier (stops at the first path separator or end)\n );\n const [proto, value, modifierSeperator, modifier] = componentsRegex // eslint-disable-line no-unused-vars\n .exec(identifier)\n .map(match => match || null);\n\n // Validate and process name\n if (!value) {\n throw new Error(`Check your URL. No channel name provided before \"${modifierSeperator}\"`);\n }\n const isChannel = value.startsWith(module.exports.CHANNEL_CHAR);\n const channelName = isChannel ? value : null;\n let claimId;\n if (isChannel) {\n if (!channelName) {\n throw new Error('Check your URL. No channel name after \"@\".');\n }\n const nameBadChars = (channelName).match(module.exports.REGEXP_INVALID_CHANNEL);\n if (nameBadChars) {\n throw new Error(`Check your URL. Invalid characters in channel name: \"${nameBadChars.join(', ')}\".`);\n }\n } else {\n claimId = value;\n }\n\n // Validate and process modifier\n let channelClaimId;\n if (modifierSeperator) {\n if (!modifier) {\n throw new Error(`Check your URL. No modifier provided after separator \"${modifierSeperator}\"`);\n }\n\n if (modifierSeperator === ':') {\n channelClaimId = modifier;\n } else {\n throw new Error(`Check your URL. The \"${modifierSeperator}\" modifier is not currently supported`);\n }\n }\n return {\n isChannel,\n channelName,\n channelClaimId: channelClaimId || null,\n claimId : claimId || null,\n };\n },\n parseClaim: function (name) {\n const componentsRegex = new RegExp(\n '([^:$#/.]*)' + // name (stops at the first extension)\n '([:$#.]?)([^/]*)' // extension separator, extension (stops at the first path separator or end)\n );\n const [proto, claimName, extensionSeperator, extension] = componentsRegex // eslint-disable-line no-unused-vars\n .exec(name)\n .map(match => match || null);\n\n // Validate and process name\n if (!claimName) {\n throw new Error('Check your URL. No claim name provided before \".\"');\n }\n const nameBadChars = (claimName).match(module.exports.REGEXP_INVALID_CLAIM);\n if (nameBadChars) {\n throw new Error(`Check your URL. Invalid characters in claim name: \"${nameBadChars.join(', ')}\".`);\n }\n // Validate and process extension\n if (extensionSeperator) {\n if (!extension) {\n throw new Error(`Check your URL. No file extension provided after separator \"${extensionSeperator}\".`);\n }\n if (extensionSeperator !== '.') {\n throw new Error(`Check your URL. The \"${extensionSeperator}\" separator is not supported in the claim name.`);\n }\n }\n return {\n claimName,\n extension: extension || null,\n };\n },\n};\n\n\n\n// WEBPACK FOOTER //\n// ./react/utils/lbryUri.js","const handlePageRender = require('../helpers/handlePageRender.jsx');\n\nmodule.exports = app => {\n // a catch-all route if someone visits a page that does not exist\n app.use('*', (req, res) => {\n // send response\n handlePageRender(req, res);\n });\n};\n\n\n\n// WEBPACK FOOTER //\n// ./routes/fallback-routes.js","module.exports = require(\"http\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"http\"\n// module id = 149\n// module chunks = 0"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///index.js","webpack:///webpack/bootstrap 47ef8a56670ef614a652","webpack:///external \"react\"","webpack:///external \"react-redux\"","webpack:///external \"winston\"","webpack:///./config/speechConfig.js","webpack:///external \"react-router-dom\"","webpack:///./react/actions/publish.js","webpack:///./models/index.js","webpack:///./react/containers/NavBar/index.js","webpack:///./react/actions/show.js","webpack:///./react/components/SEO/index.jsx","webpack:///external \"prop-types\"","webpack:///./react/utils/request.js","webpack:///./react/constants/show_action_types.js","webpack:///./react/selectors/show.js","webpack:///external \"react-helmet\"","webpack:///external \"redux-saga/effects\"","webpack:///./helpers/lbryApi.js","webpack:///./helpers/googleAnalytics.js","webpack:///external \"redux\"","webpack:///./react/actions/channel.js","webpack:///./react/components/ProgressBar/index.jsx","webpack:///./react/components/ErrorPage/index.jsx","webpack:///external \"passport\"","webpack:///./helpers/sequelizeHelpers.js","webpack:///external \"passport-local\"","webpack:///./helpers/publishHelpers.js","webpack:///./helpers/errorHandlers.js","webpack:///./controllers/serveController.js","webpack:///./helpers/handlePageRender.jsx","webpack:///external \"react-dom/server\"","webpack:///./react/reducers/index.js","webpack:///./react/constants/publish_action_types.js","webpack:///./react/constants/publish_channel_select_states.js","webpack:///./react/constants/channel_action_types.js","webpack:///./react/constants/asset_display_states.js","webpack:///./react/components/GAListener/index.jsx","webpack:///./react/app.js","webpack:///./react/containers/Dropzone/index.js","webpack:///./react/containers/ChannelLoginForm/index.js","webpack:///./react/containers/ChannelCreateForm/index.js","webpack:///./react/constants/show_request_types.js","webpack:///./react/containers/AssetDisplay/index.js","webpack:///./helpers/renderFullPage.js","webpack:///external \"babel-polyfill\"","webpack:///external \"whatwg-fetch\"","webpack:///./server.js","webpack:///external \"express\"","webpack:///external \"body-parser\"","webpack:///external \"express-handlebars\"","webpack:///external \"handlebars\"","webpack:///./helpers/authHelpers.js","webpack:///external \"helmet\"","webpack:///external \"cookie-session\"","webpack:///./config/loggerConfig.js","webpack:///./config/slackConfig.js","webpack:///external \"winston-slack-webhook\"","webpack:///./helpers/configVarCheck.js","webpack:///./passport/local-signup.js","webpack:///external \"sequelize\"","webpack:///./models/certificate.js","webpack:///./models/channel.js","webpack:///./models/claim.js","webpack:///./models/file.js","webpack:///./models/request.js","webpack:///./models/user.js","webpack:///external \"bcrypt\"","webpack:///external \"axios\"","webpack:///external \"universal-analytics\"","webpack:///./passport/local-login.js","webpack:///./routes/auth-routes.js","webpack:///./routes/api-routes.js","webpack:///external \"connect-multiparty\"","webpack:///./controllers/publishController.js","webpack:///external \"fs\"","webpack:///./auth/authentication.js","webpack:///./helpers/channelPagination.js","webpack:///./routes/page-routes.js","webpack:///./react/reducers/publish.js","webpack:///./react/reducers/channel.js","webpack:///./react/reducers/show.js","webpack:///./react/reducers/site.js","webpack:///external \"react-ga\"","webpack:///./react/components/HomePage/index.jsx","webpack:///./react/utils/pageTitle.js","webpack:///./react/utils/metaTags.js","webpack:///./react/utils/canonicalLink.js","webpack:///./react/containers/NavBar/view.jsx","webpack:///./react/components/Logo/index.jsx","webpack:///./react/components/NavBarChannelOptionsDropdown/index.jsx","webpack:///external \"cross-fetch/polyfill\"","webpack:///./react/containers/PublishTool/index.js","webpack:///./react/containers/PublishTool/view.jsx","webpack:///./react/containers/Dropzone/view.jsx","webpack:///./react/utils/file.js","webpack:///./react/components/Preview/index.jsx","webpack:///./react/containers/PublishDetails/index.js","webpack:///./react/containers/PublishDetails/view.jsx","webpack:///./react/containers/PublishTitleInput/index.js","webpack:///./react/containers/PublishTitleInput/view.jsx","webpack:///./react/containers/PublishUrlInput/index.js","webpack:///./react/containers/PublishUrlInput/view.jsx","webpack:///./react/components/PublishUrlMiddleDisplay/index.jsx","webpack:///./react/containers/PublishThumbnailInput/index.js","webpack:///./react/containers/PublishThumbnailInput/view.jsx","webpack:///./react/containers/PublishMetadataInputs/index.js","webpack:///./react/containers/PublishMetadataInputs/view.jsx","webpack:///./react/components/ExpandingTextArea/index.jsx","webpack:///./react/containers/ChannelSelect/index.js","webpack:///./react/containers/ChannelSelect/view.jsx","webpack:///./react/containers/ChannelLoginForm/view.jsx","webpack:///./react/containers/ChannelCreateForm/view.jsx","webpack:///./react/components/ActiveStatusBar/index.jsx","webpack:///./react/components/InactiveStatusBar/index.jsx","webpack:///./react/containers/PublishStatus/index.js","webpack:///./react/containers/PublishStatus/view.jsx","webpack:///./react/constants/publish_claim_states.js","webpack:///./react/components/AboutPage/index.jsx","webpack:///./react/containers/LoginPage/index.js","webpack:///./react/containers/LoginPage/view.jsx","webpack:///./react/containers/ShowPage/index.js","webpack:///./react/containers/ShowPage/view.jsx","webpack:///./react/containers/ShowAssetLite/index.js","webpack:///./react/containers/ShowAssetLite/view.jsx","webpack:///./react/containers/AssetDisplay/view.jsx","webpack:///./react/containers/ShowAssetDetails/index.js","webpack:///./react/containers/ShowAssetDetails/view.jsx","webpack:///./react/containers/AssetTitle/index.js","webpack:///./react/containers/AssetTitle/view.jsx","webpack:///./react/containers/AssetInfo/index.js","webpack:///./react/containers/AssetInfo/view.jsx","webpack:///./react/containers/ShowChannel/index.js","webpack:///./react/containers/ShowChannel/view.jsx","webpack:///./react/containers/ChannelClaimsDisplay/index.js","webpack:///./react/containers/ChannelClaimsDisplay/view.jsx","webpack:///./react/components/AssetPreview/index.jsx","webpack:///./react/components/FourOhFourPage/index.jsx","webpack:///./routes/serve-routes.js","webpack:///./helpers/serveHelpers.js","webpack:///./helpers/lbryUri.js","webpack:///./helpers/handleShowRender.jsx","webpack:///external \"redux-saga\"","webpack:///./react/sagas/show_uri.js","webpack:///./react/sagas/show_asset.js","webpack:///./react/api/assetApi.js","webpack:///./react/sagas/show_channel.js","webpack:///./react/api/channelApi.js","webpack:///./react/utils/lbryUri.js","webpack:///./routes/fallback-routes.js","webpack:///external \"http\""],"names":["modules","__webpack_require__","moduleId","installedModules","exports","module","i","l","call","m","c","d","name","getter","o","Object","defineProperty","configurable","enumerable","get","n","__esModule","object","property","prototype","hasOwnProperty","p","s","require","analytics","googleId","logging","logLevel","slackWebHook","slackErrorChannel","slackInfoChannel","session","sessionKey","files","uploadDirectory","site","title","host","description","publish","primaryClaimAddress","additionalClaimAddresses","thumbnailChannel","thumbnailChannelId","claim","defaultTitle","defaultThumbnail","defaultDescription","testing","testChannel","testChannelId","testChannelPassword","api","apiHost","apiPort","selectFile","file","type","actions","FILE_SELECTED","data","clearFile","FILE_CLEAR","updateMetadata","value","METADATA_UPDATE","updateClaim","CLAIM_UPDATE","setPublishInChannel","channel","SET_PUBLISH_IN_CHANNEL","updatePublishStatus","status","message","PUBLISH_STATUS_UPDATE","updateError","ERROR_UPDATE","updateSelectedChannel","channelName","SELECTED_CHANNEL_UPDATE","toggleMetadataInputs","showMetadataInputs","TOGGLE_METADATA_INPUTS","onNewThumbnail","THUMBNAIL_NEW","startPublish","history","PUBLISH_START","_publish_action_types","obj","newObj","key","default","Sequelize","logger","mysqlConfig","database","username","password","db","sequelize","dialect","dialectOptions","decimalNumbers","pool","max","min","idle","acquire","authenticate","then","info","catch","err","error","Certificate","Channel","Claim","File","Request","User","import","keys","forEach","modelName","associate","upsert","Model","values","condition","tableName","findOne","where","debug","update","create","_reactRedux","_channel","_view","_view2","_publish","mapStateToProps","_ref","loggedInChannel","channelShortId","shortId","channelLongId","longId","mapDispatchToProps","dispatch","onChannelLogin","updateLoggedInChannel","onChannelLogout","connect","onHandleShowPageUri","params","HANDLE_SHOW_URI","onRequestError","REQUEST_ERROR","onNewChannelRequest","channelId","requestType","requestId","CHANNEL_REQUEST_NEW","onNewAssetRequest","id","extension","ASSET_REQUEST_NEW","modifier","onRequestUpdate","REQUEST_UPDATE","addRequestToRequestList","REQUEST_LIST_ADD","addAssetToAssetList","claimId","claimData","ASSET_ADD","addNewChannelToChannelList","claimsData","CHANNEL_ADD","onUpdateChannelClaims","channelKey","page","CHANNEL_CLAIMS_UPDATE_ASYNC","updateChannelClaims","channelListId","CHANNEL_CLAIMS_UPDATE_SUCCESS","fileRequested","FILE_REQUESTED","updateFileAvailability","FILE_AVAILABILITY_UPDATE","updateDisplayAssetError","DISPLAY_ASSET_ERROR","_show_action_types","_show_request_types","_interopRequireDefault","_classCallCheck","instance","Constructor","TypeError","_possibleConstructorReturn","self","ReferenceError","_inherits","subClass","superClass","constructor","writable","setPrototypeOf","__proto__","_createClass","defineProperties","target","props","length","descriptor","protoProps","staticProps","_react","_react2","_reactHelmet","_reactHelmet2","_propTypes","_propTypes2","_pageTitle","_metaTags","_canonicalLink","SEO","_React$Component","this","getPrototypeOf","apply","arguments","_props","pageTitle","asset","pageUri","createPageTitle","metaTags","createMetaTags","canonicalLink","createCanonicalLink","createElement","meta","link","rel","href","Component","propTypes","string","parseJSON","response","json","checkStatus","jsonResponse","Error","request","url","options","fetch","Promise","all","_ref2","_slicedToArray","sliceIterator","arr","_arr","_n","_d","_e","undefined","_s","_i","Symbol","iterator","next","done","push","Array","isArray","selectAsset","show","requestList","assetKey","assetList","selectShowState","state","axios","config","_config$api","lbryApiUri","_require","chooseGaLbrynetPublishLabel","sendGATimingEvent","handleLbrynetResponse","resolve","reject","result","JSON","stringify","publishClaim","publishParams","gaStartTime","Date","now","post","method","getClaim","uri","timeout","getClaimList","claimName","resolveUri","getDownloadDirectory","_ref3","download_directory","createChannel","channel_name","amount","createServeEventParams","headers","ip","originalUrl","eventCategory","eventAction","eventLabel","ipOverride","userAgentOverride","createPublishTimingEventParams","category","variable","label","startTime","endTime","userTimingCategory","userTimingVariableName","userTimingTime","userTimingLabel","sendGoogleAnalyticsEvent","visitorId","replace","ua","strictCidFormat","https","event","sendGoogleAnalyticsTiming","timing","siteName","sendGAServeEvent","channel_id","CHANNEL_UPDATE","_channel_action_types","_ActiveStatusBar","_ActiveStatusBar2","_InactiveStatusBar","_InactiveStatusBar2","ProgressBar","_this","bars","index","incrementer","createBars","bind","startProgressBar","updateProgressBar","stopProgressBar","size","isActive","setState","updateInterval","setInterval","clearInterval","map","bar","number","isRequired","_NavBar","_NavBar2","ErrorPage","className","returnShortId","claimsArray","claimIndex","substring","shortIdLength","findIndex","element","possibleMatches","slice","filter","fs","wallet","parsePublishApiRequestBody","nsfw","license","thumbnail","exec","parsePublishApiRequestFiles","path","test","validateFileTypeAndSize","fileName","filePath","fileType","thumbnailFileName","thumbnailFilePath","thumbnailFileType","createBasicPublishParams","trim","file_path","bid","metadata","author","language","claim_address","lbryClaimAddress","createThumbnailPublishParams","deleteTemporaryFile","unlink","addGetResultsToFileData","fileInfo","getResult","file_name","download_path","createFileData","outpoint","height","address","contentType","handleErrorResponse","res","useObjectPropertiesIfNoKeys","_module$exports$retur","returnErrorMessageAndStatus","_module$exports$retur2","createErrorResponsePayload","code","newErrorObject","getOwnPropertyNames","success","returnPaginatedChannelClaims","getClaimId","channelClaimId","getClaimIdByChannel","getClaimIdByClaim","getLongClaimId","longClaimId","getLongChannelId","longChannelId","getClaimIdByLongChannelId","getChannelData","longChannelClaimId","getShortChannelIdFromLongChannelId","_ref4","shortChannelClaimId","getChannelClaims","getAllChannelClaims","_ref5","_ref6","channelClaimsArray","paginatedChannelViewData","getLocalFileRecord","dataValues","_server","_redux","_reducers","_reducers2","_reactRouterDom","_GAListener","_GAListener2","_app","_app2","_renderFullPage","_renderFullPage2","req","context","store","createStore","html","renderToString","Provider","StaticRouter","location","helmet","renderStatic","redirect","preloadedState","getState","send","_publish2","_channel2","_show","_show2","_site","_site2","combineReducers","LOGIN","CREATE","LOCAL_CHECK","UNAVAILABLE","ERROR","AVAILABLE","_reactGa","_reactGa2","googleApiKey","initialize","GAListener","sendPageView","listen","set","pathname","pageview","children","withRouter","_HomePage","_HomePage2","_AboutPage","_AboutPage2","_LoginPage","_LoginPage2","_ShowPage","_ShowPage2","_FourOhFourPage","_FourOhFourPage2","App","Switch","Route","exact","component","fileError","setFileError","CHANNEL","ASSET_LITE","ASSET_DETAILS","displayAsset","onFileRequest","toString","express","bodyParser","expressHandlebars","Handlebars","populateLocalsDotUser","serializeSpeechUser","deserializeSpeechUser","app","passport","cookieSession","enable","use","static","__dirname","urlencoded","extended","verbose","serializeUser","deserializeUser","localSignupStrategy","localLoginStrategy","maxAge","hbs","defaultLayout","handlebars","engine","hello","console","log","speak","something","user","locals","userName","shortChannelId","winston","configure","transports","Console","level","timestamp","colorize","prettyPrint","handleExceptions","humanReadableUnhandledException","warn","silly","winstonSlackWebHook","SlackWebHook","add","webhookUrl","iconEmoji","configCategoryKey","configVariables","configVarKey","PassportLocalStrategy","Strategy","lbryApi","usernameField","passwordField","userInfo","tx","userData","channelData","claim_id","certificateData","newUser","newChannel","newCertificate","setChannel","setUser","STRING","BOOLEAN","INTEGER","TEXT","DECIMAL","define","claimSequence","decodedClaim","depth","effectiveAmount","hasSignature","hex","nout","txid","validAtHeight","valueVersion","claimType","certificateVersion","keyType","publicKey","freezeTableName","belongsTo","foreignKey","allowNull","findAll","order","getLongChannelIdFromShortChannelId","_this2","$like","getLongChannelIdFromChannelName","_this3","validateLongChannelId","_this4","hasOne","determineFileExtensionFromContentType","determineThumbnail","storedThumbnail","prepareClaimData","_require2","certificateId","licenseUrl","preview","metadataVersion","source","sourceType","sourceVersion","streamVersion","getShortClaimIdFromLongClaimId","raw","getLongClaimIdFromShortClaimId","getTopFreeClaimIdByClaimName","_this5","validateLongClaimId","_this6","resolveClaim","_this7","claimArray","defaultValue","trendingEligible","hasMany","getRecentClaims","limit","action","ipAddress","bcrypt","comparePassword","compare","changePassword","newPassword","genSalt","saltError","salt","hash","hashError","hook","returnUserAndChannelInfo","userInstance","getChannel","isMatch","logIn","logout","multipart","multipartMiddleware","uploadDir","claimNameIsAvailable","checkChannelAvailability","_require3","_require4","errorHandlers","_require5","_require6","authenticateUser","_require7","body","claimsList","resolveResult","fileData","_ref7","_ref8","_ref9","_ref10","_ref10$","completed","_ref11","_ref12","resolvedUri","_ref13","channelPassword","_parsePublishApiReque","_parsePublishApiReque2","_ref14","_ref15","_ref15$","thumbnailPublishParams","lbryTx","_ref16","_ref17","_ref18","claimInfo","_ref19","publishHelpers","publishResults","fileRecord","claimRecord","upsertCriteria","setClaim","setFile","claimAddress","authenticateChannelCredentials","userPassword","channelFindParams","claims","totalPages","determineTotalPages","paginationPage","getPageFromQuery","extractPageFromClaims","previousPage","determinePreviousPage","currentPage","nextPage","determineNextPage","totalResults","determineTotalClaims","parseInt","pageNumber","claimStartIndex","claimEndIndex","totalClaims","fullPages","Math","floor","handlePageRender","render","layout","_defineProperty","initialState","assign","publishInChannel","selectedChannel","_publish_channel_select_states","publishSubmit","channelList","_asset_display_states","_SEO","_SEO2","_PublishTool","_PublishTool2","HomePage","siteTitle","_require$site","_require$claim","determineOgThumbnailContentType","lastIndexOf","createBasicMetaTags","content","createChannelMetaTags","createAssetMetaTags","embedUrl","showUrl","fileExt","ogTitle","ogDescription","ogThumbnailContentType","ogThumbnail","createBasicCanonicalLink","createAssetCanonicalLink","_asset$claimData","createChannelCanonicalLink","_Logo","_Logo2","_NavBarChannelOptionsDropdown","_NavBarChannelOptionsDropdown2","_request","_request2","NavBar","checkForLoggedInUser","logoutUser","handleSelection","credentials","selectedOptions","NavLink","activeClassName","to","defaultSelection","VIEW","LOGOUT","Logo","version","x","y","viewBox","enableBackground","Link","transform","fontSize","fontFamily","fill","stroke","strokeWidth","strokeLinecap","NavBarChannelDropdown","onChange","_Dropzone","_Dropzone2","_PublishDetails","_PublishDetails2","_PublishStatus","_PublishStatus2","PublishTool","_file","_Preview","_Preview2","Dropzone","dragOver","mouseOver","dimPreview","handleDrop","handleDragOver","handleDragEnd","handleDragEnter","handleDragLeave","handleMouseEnter","handleMouseLeave","handleClick","handleFileInput","chooseFile","preventDefault","dt","dataTransfer","items","kind","droppedFile","getAsFile","remove","clearData","document","getElementById","click","fileList","validateFile","accept","encType","onDrop","onDragOver","onDragEnd","onDragEnter","onDragLeave","onMouseEnter","onMouseLeave","onClick","Preview","imgSource","setPreviewImageSource","newProps","setPreviewImageSourceFromFile","previewReader","FileReader","readAsDataURL","onloadend","src","alt","bool","_PublishTitleInput","_PublishTitleInput2","_PublishUrlInput","_PublishUrlInput2","_PublishThumbnailInput","_PublishThumbnailInput2","_PublishMetadataInputs","_PublishMetadataInputs2","_ChannelSelect","_ChannelSelect2","PublishDetails","onPublishSubmit","onMetadataChange","PublishTitleInput","handleInput","e","placeholder","loggedInChannelName","loggedInChannelShortId","urlError","onClaimChange","onUrlError","_PublishUrlMiddleDisplay","_PublishUrlMiddleDisplay2","PublishUrlInput","setClaimName","validateClaim","cleanseInput","input","fileNameWithoutEnding","cleanClaimName","_props2","UrlMiddle","dataURItoBlob","dataURI","byteString","atob","split","mimeString","ia","Uint8Array","charCodeAt","Blob","PublishThumbnailInput","videoSource","sliderMinRange","sliderMaxRange","sliderValue","handleVideoLoadedData","handleSliderChange","createThumbnail","setVideoSource","nextProps","dataUri","blob","URL","createObjectURL","duration","totalMinutes","totalSeconds","currentTime","video","canvas","width","videoWidth","videoHeight","getContext","drawImage","dataUrl","toDataURL","snapshot","_state","preload","muted","style","display","playsInline","onLoadedData","onSeeked","onToggleMetadataInputs","_ExpandingTextArea","_ExpandingTextArea2","PublishMetadataInputs","toggleShowInputs","handleSelect","checked","selectedOption","htmlFor","rows","maxLength","maxHeight","_objectWithoutProperties","indexOf","_extends","ExpandingTextarea","_Component","_handleChange","adjustTextarea","_ref$target","el","scrollHeight","rest","ref","func","channelError","onPublishInChannelChange","onChannelSelect","_ChannelLoginForm","_ChannelLoginForm2","_ChannelCreateForm","_ChannelCreateForm2","states","ChannelSelect","toggleAnonymousPublish","ChannelLoginForm","loginToChannel","Headers","Content-Type","_ProgressBar","_ProgressBar2","ChannelCreateForm","handleChannelInput","cleanseChannelInput","updateIsChannelAvailable","channelWithAtSymbol","isAvailable","checkIsPasswordProvided","checkIsChannelAvailable","makePublishChannelRequest","ActiveStatusBar","InactiveStatusBar","_publish_claim_states","publishStates","PublishStatus","LOAD_START","LOADING","PUBLISHING","SUCCESS","FAILED","AboutPage","LoginPage","_ErrorPage","_ErrorPage2","_ShowAssetLite","_ShowAssetLite2","_ShowAssetDetails","_ShowAssetDetails2","_ShowChannel","_ShowChannel2","ShowPage","match","_AssetDisplay","_AssetDisplay2","ShowLite","AssetDisplay","_props$asset$claimDat","_props$asset$claimDat2","controls","poster","_AssetTitle","_AssetTitle2","_AssetInfo","_AssetInfo2","ShowAssetDetails","AssetTitle","AssetInfo","copyToClipboard","elementToCopy","dataset","elementtocopy","select","execCommand","_props$asset","hidden","readOnly","spellCheck","data-elementtocopy","download","previousRequest","_ChannelClaimsDisplay","_ChannelClaimsDisplay2","ShowChannel","_AssetPreview","_AssetPreview2","ChannelClaimsDisplay","showNextResultsPage","showPreviousResultsPage","showNewPage","_props$channel","_props$channel$claims","AssetPreview","_ref$claimData","directSourceLink","showUrlLink","FourOhForPage","determineResponseType","flipClaimNameAndIdForBackwardsCompatibility","logRequestData","getClaimIdAndServeAsset","lbryUri","handleShowRender","hasFileExtension","parseModifier","responseType","parseClaim","isChannel","_lbryUri$parseIdentif","parseIdentifier","identifier","_flipClaimNameAndIdFo","_flipClaimNameAndIdFo2","clientAcceptsHtml","requestIsFromBrowser","clientWantsAsset","range","imageIsWanted","videoIsWanted","isValidClaimId","isValidShortId","isValidShortIdOrClaimId","serveAssetToClient","NO_FILE","sendFileOptions","X-Content-Type-Options","sendFile","fullClaimId","tempName","REGEXP_INVALID_CLAIM","REGEXP_INVALID_CHANNEL","REGEXP_ADDRESS","CHANNEL_CHAR","componentsRegex","RegExp","_componentsRegex$exec","_componentsRegex$exec2","proto","modifierSeperator","startsWith","nameBadChars","join","_componentsRegex$exec3","_componentsRegex$exec4","_componentsRegex$exec5","_componentsRegex$exec6","_reduxSaga","_reduxSaga2","_effects","_show_uri","returnSagaWithParams","saga","regeneratorRuntime","mark","_callee","wrap","_context","prev","stop","sagaMiddleware","middleware","applyMiddleware","run","parseAndUpdateIdentifierAndClaim","_lbryUri$parseClaim","_lbryUri2","t0","put","abrupt","sent","_show_asset","newAssetRequest","_marked","parseAndUpdateClaimOnly","_lbryUri$parseIdentif2","_lbryUri$parseClaim2","_context2","_show_channel","newChannelRequest","t1","_marked2","handleShowPageUri","_action$data","_context3","_marked3","watchHandleShowPageUri","_context4","takeLatest","_marked4","_lbryUri","_assetApi","getShortId","getClaimData","t2","watchNewAssetRequest","_ref$data","_channelApi","watchNewChannelRequest","getNewClaimsAndUpdateChannel","_action$data2","watchUpdateChannelClaims","extensionSeperator"],"mappings":"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","file":"index.js","sourcesContent":["/******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"/\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 43);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"react\");\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"react-redux\");\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"winston\");\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = {\n analytics: {\n googleId: 'UA-60403362-6' // google id for analytics tracking; leave `null` if not applicable\n },\n logging: {\n logLevel: 'debug', // options: silly, debug, verbose, info\n slackWebHook: 'https://hooks.slack.com/services/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', // enter a webhook if you wish to push logs to slack; otherwise leave as `null`\n slackErrorChannel: null, // enter a slack channel (#example) for errors to be sent to; otherwise leave null\n slackInfoChannel: '#speech-dev1-errors' // enter a slack channel (#info) for info level logs to be sent to otherwise leave null\n },\n session: {\n sessionKey: 'nans$#kfjanwe234rydns' // enter a secret key to be used for session encryption\n },\n files: {\n uploadDirectory: '/home/lbry/Uploads' // enter file path to where uploads/publishes should be stored\n },\n site: {\n title: 'dev1.Spee.ch',\n name: 'dev1.Spee.ch',\n host: 'https://dev1.spee.ch',\n description: 'Open-source, decentralized image and video sharing.'\n },\n publish: {\n primaryClaimAddress: 'bDZ2wPwtULUGxT7GXuNLpQhXmdPRUTUkcL',\n additionalClaimAddresses: ['banpwixPosfVDWnGvXqU2af36Qpsd7buGd'],\n thumbnailChannel: '@dev1thumbs', // create a channel to use for thumbnail images\n thumbnailChannelId: 'aeb625ff6f66c3eeeb42885070f4e53876033626' // the channel_id (claim id) for the channel above\n },\n claim: {\n defaultTitle: 'dev1 Spee.ch',\n defaultThumbnail: 'https://spee.ch/assets/img/video_thumb_default.png',\n defaultDescription: 'Open-source, decentralized image and video sharing.'\n },\n testing: {\n testChannel: '@test', // a channel to make test publishes in\n testChannelId: '3b5bc6b6819172c6e2f3f90aa855b14a956b4a82', // the claim id for the test channel\n testChannelPassword: '1234' // password for the test channel\n },\n api: {\n apiHost: 'localhost',\n apiPort: '5279'\n }\n};\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"react-router-dom\");\n\n/***/ }),\n/* 5 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.selectFile = selectFile;\nexports.clearFile = clearFile;\nexports.updateMetadata = updateMetadata;\nexports.updateClaim = updateClaim;\nexports.setPublishInChannel = setPublishInChannel;\nexports.updatePublishStatus = updatePublishStatus;\nexports.updateError = updateError;\nexports.updateSelectedChannel = updateSelectedChannel;\nexports.toggleMetadataInputs = toggleMetadataInputs;\nexports.onNewThumbnail = onNewThumbnail;\nexports.startPublish = startPublish;\n\nvar _publish_action_types = __webpack_require__(31);\n\nvar actions = _interopRequireWildcard(_publish_action_types);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\n// export action creators\nfunction selectFile(file) {\n return {\n type: actions.FILE_SELECTED,\n data: file\n };\n};\n\nfunction clearFile() {\n return {\n type: actions.FILE_CLEAR\n };\n};\n\nfunction updateMetadata(name, value) {\n return {\n type: actions.METADATA_UPDATE,\n data: {\n name: name,\n value: value\n }\n };\n};\n\nfunction updateClaim(value) {\n return {\n type: actions.CLAIM_UPDATE,\n data: value\n };\n};\n\nfunction setPublishInChannel(channel) {\n return {\n type: actions.SET_PUBLISH_IN_CHANNEL,\n channel: channel\n };\n};\n\nfunction updatePublishStatus(status, message) {\n return {\n type: actions.PUBLISH_STATUS_UPDATE,\n data: {\n status: status,\n message: message\n }\n };\n};\n\nfunction updateError(name, value) {\n return {\n type: actions.ERROR_UPDATE,\n data: {\n name: name,\n value: value\n }\n };\n};\n\nfunction updateSelectedChannel(channelName) {\n return {\n type: actions.SELECTED_CHANNEL_UPDATE,\n data: channelName\n };\n};\n\nfunction toggleMetadataInputs(showMetadataInputs) {\n return {\n type: actions.TOGGLE_METADATA_INPUTS,\n data: showMetadataInputs\n };\n};\n\nfunction onNewThumbnail(file) {\n return {\n type: actions.THUMBNAIL_NEW,\n data: file\n };\n};\n\nfunction startPublish(history) {\n return {\n type: actions.PUBLISH_START,\n data: { history: history }\n };\n}\n\n/***/ }),\n/* 6 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar Sequelize = __webpack_require__(59);\nvar logger = __webpack_require__(2);\n\nmodule.exports = function (mysqlConfig) {\n var database = mysqlConfig.database,\n username = mysqlConfig.username,\n password = mysqlConfig.password;\n\n var db = {};\n // set sequelize options\n var sequelize = new Sequelize(database, username, password, {\n host: 'localhost',\n dialect: 'mysql',\n dialectOptions: { decimalNumbers: true }, // fix to ensure DECIMAL will not be stored as a string\n logging: false,\n pool: {\n max: 5,\n min: 0,\n idle: 10000,\n acquire: 10000\n }\n });\n\n // establish mysql connection\n sequelize.authenticate().then(function () {\n logger.info('Sequelize has established mysql connection successfully.');\n }).catch(function (err) {\n logger.error('Sequelize was unable to connect to the database:', err);\n });\n\n // manually add each model to the db object\n var Certificate = __webpack_require__(60);\n var Channel = __webpack_require__(61);\n var Claim = __webpack_require__(62);\n var File = __webpack_require__(63);\n var Request = __webpack_require__(64);\n var User = __webpack_require__(65);\n db['Certificate'] = sequelize.import('Certificate', Certificate);\n db['Channel'] = sequelize.import('Channel', Channel);\n db['Claim'] = sequelize.import('Claim', Claim);\n db['File'] = sequelize.import('File', File);\n db['Request'] = sequelize.import('Request', Request);\n db['User'] = sequelize.import('User', User);\n\n // run model.association for each model in the db object that has an association\n Object.keys(db).forEach(function (modelName) {\n if (db[modelName].associate) {\n logger.info('Associating model:', modelName);\n db[modelName].associate(db);\n }\n });\n\n db.sequelize = sequelize;\n db.Sequelize = Sequelize;\n\n // add an 'upsert' method to the db object\n db.upsert = function (Model, values, condition, tableName) {\n return Model.findOne({\n where: condition\n }).then(function (obj) {\n if (obj) {\n // update\n logger.debug('updating record in db.' + tableName);\n return obj.update(values);\n } else {\n // insert\n logger.debug('creating record in db.' + tableName);\n return Model.create(values);\n }\n }).catch(function (error) {\n logger.error(tableName + '.upsert error', error);\n throw error;\n });\n };\n\n return db;\n};\n\n/***/ }),\n/* 7 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _reactRedux = __webpack_require__(1);\n\nvar _channel = __webpack_require__(19);\n\nvar _view = __webpack_require__(87);\n\nvar _view2 = _interopRequireDefault(_view);\n\nvar _publish = __webpack_require__(5);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar mapStateToProps = function mapStateToProps(_ref) {\n var channel = _ref.channel;\n\n return {\n channelName: channel.loggedInChannel.name,\n channelShortId: channel.loggedInChannel.shortId,\n channelLongId: channel.loggedInChannel.longId\n };\n};\n\nvar mapDispatchToProps = function mapDispatchToProps(dispatch) {\n return {\n onChannelLogin: function onChannelLogin(name, shortId, longId) {\n dispatch((0, _channel.updateLoggedInChannel)(name, shortId, longId));\n dispatch((0, _publish.updateSelectedChannel)(name));\n },\n onChannelLogout: function onChannelLogout() {\n dispatch((0, _channel.updateLoggedInChannel)(null, null, null));\n }\n };\n};\n\nexports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(_view2.default);\n\n/***/ }),\n/* 8 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.onHandleShowPageUri = onHandleShowPageUri;\nexports.onRequestError = onRequestError;\nexports.onNewChannelRequest = onNewChannelRequest;\nexports.onNewAssetRequest = onNewAssetRequest;\nexports.onRequestUpdate = onRequestUpdate;\nexports.addRequestToRequestList = addRequestToRequestList;\nexports.addAssetToAssetList = addAssetToAssetList;\nexports.addNewChannelToChannelList = addNewChannelToChannelList;\nexports.onUpdateChannelClaims = onUpdateChannelClaims;\nexports.updateChannelClaims = updateChannelClaims;\nexports.fileRequested = fileRequested;\nexports.updateFileAvailability = updateFileAvailability;\nexports.updateDisplayAssetError = updateDisplayAssetError;\n\nvar _show_action_types = __webpack_require__(12);\n\nvar actions = _interopRequireWildcard(_show_action_types);\n\nvar _show_request_types = __webpack_require__(40);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\n// basic request parsing\nfunction onHandleShowPageUri(params) {\n return {\n type: actions.HANDLE_SHOW_URI,\n data: params\n };\n};\n\nfunction onRequestError(error) {\n return {\n type: actions.REQUEST_ERROR,\n data: error\n };\n};\n\nfunction onNewChannelRequest(channelName, channelId) {\n var requestType = _show_request_types.CHANNEL;\n var requestId = 'cr#' + channelName + '#' + channelId;\n return {\n type: actions.CHANNEL_REQUEST_NEW,\n data: { requestType: requestType, requestId: requestId, channelName: channelName, channelId: channelId }\n };\n};\n\nfunction onNewAssetRequest(name, id, channelName, channelId, extension) {\n var requestType = extension ? _show_request_types.ASSET_LITE : _show_request_types.ASSET_DETAILS;\n var requestId = 'ar#' + name + '#' + id + '#' + channelName + '#' + channelId;\n return {\n type: actions.ASSET_REQUEST_NEW,\n data: {\n requestType: requestType,\n requestId: requestId,\n name: name,\n modifier: {\n id: id,\n channel: {\n name: channelName,\n id: channelId\n }\n }\n }\n };\n};\n\nfunction onRequestUpdate(requestType, requestId) {\n return {\n type: actions.REQUEST_UPDATE,\n data: {\n requestType: requestType,\n requestId: requestId\n }\n };\n};\n\nfunction addRequestToRequestList(id, error, key) {\n return {\n type: actions.REQUEST_LIST_ADD,\n data: { id: id, error: error, key: key }\n };\n};\n\n// asset actions\n\nfunction addAssetToAssetList(id, error, name, claimId, shortId, claimData) {\n return {\n type: actions.ASSET_ADD,\n data: { id: id, error: error, name: name, claimId: claimId, shortId: shortId, claimData: claimData }\n };\n}\n\n// channel actions\n\nfunction addNewChannelToChannelList(id, name, shortId, longId, claimsData) {\n return {\n type: actions.CHANNEL_ADD,\n data: { id: id, name: name, shortId: shortId, longId: longId, claimsData: claimsData }\n };\n};\n\nfunction onUpdateChannelClaims(channelKey, name, longId, page) {\n return {\n type: actions.CHANNEL_CLAIMS_UPDATE_ASYNC,\n data: { channelKey: channelKey, name: name, longId: longId, page: page }\n };\n};\n\nfunction updateChannelClaims(channelListId, claimsData) {\n return {\n type: actions.CHANNEL_CLAIMS_UPDATE_SUCCESS,\n data: { channelListId: channelListId, claimsData: claimsData }\n };\n};\n\n// display a file\n\nfunction fileRequested(name, claimId) {\n return {\n type: actions.FILE_REQUESTED,\n data: { name: name, claimId: claimId }\n };\n};\n\nfunction updateFileAvailability(status) {\n return {\n type: actions.FILE_AVAILABILITY_UPDATE,\n data: status\n };\n};\n\nfunction updateDisplayAssetError(error) {\n return {\n type: actions.DISPLAY_ASSET_ERROR,\n data: error\n };\n};\n\n/***/ }),\n/* 9 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _reactHelmet = __webpack_require__(14);\n\nvar _reactHelmet2 = _interopRequireDefault(_reactHelmet);\n\nvar _propTypes = __webpack_require__(10);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _pageTitle = __webpack_require__(84);\n\nvar _metaTags = __webpack_require__(85);\n\nvar _canonicalLink = __webpack_require__(86);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar SEO = function (_React$Component) {\n _inherits(SEO, _React$Component);\n\n function SEO() {\n _classCallCheck(this, SEO);\n\n return _possibleConstructorReturn(this, (SEO.__proto__ || Object.getPrototypeOf(SEO)).apply(this, arguments));\n }\n\n _createClass(SEO, [{\n key: 'render',\n value: function render() {\n var _props = this.props,\n pageTitle = _props.pageTitle,\n asset = _props.asset,\n channel = _props.channel,\n pageUri = _props.pageUri;\n\n pageTitle = (0, _pageTitle.createPageTitle)(pageTitle);\n var metaTags = (0, _metaTags.createMetaTags)(asset, channel);\n var canonicalLink = (0, _canonicalLink.createCanonicalLink)(asset, channel, pageUri);\n return _react2.default.createElement(_reactHelmet2.default, {\n title: pageTitle,\n meta: metaTags,\n link: [{ rel: 'canonical', href: canonicalLink }]\n });\n }\n }]);\n\n return SEO;\n}(_react2.default.Component);\n\n;\n\nSEO.propTypes = {\n pageTitle: _propTypes2.default.string,\n pageUri: _propTypes2.default.string,\n channel: _propTypes2.default.object,\n asset: _propTypes2.default.object\n};\n\nexports.default = SEO;\n\n/***/ }),\n/* 10 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"prop-types\");\n\n/***/ }),\n/* 11 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nexports.default = request;\n\n__webpack_require__(90);\n\n/**\n * Parses the JSON returned by a network request\n *\n * @param {object} response A response from a network request\n *\n * @return {object} The parsed JSON from the request\n */\nfunction parseJSON(response) {\n if (response.status === 204 || response.status === 205) {\n return null;\n }\n return response.json();\n}\n\n/**\n * Parses the status returned by a network request\n *\n * @param {object} response A response from a network request\n * @param {object} response The parsed JSON from the network request\n *\n * @return {object | undefined} Returns object with status and statusText, or undefined\n */\nfunction checkStatus(response, jsonResponse) {\n if (response.status >= 200 && response.status < 300) {\n return jsonResponse;\n }\n var error = new Error(jsonResponse.message);\n error.response = response;\n throw error;\n}\n\n/**\n * Requests a URL, returning a promise\n *\n * @param {string} url The URL we want to request\n * @param {object} [options] The options we want to pass to \"fetch\"\n *\n * @return {object} The response data\n */\n\nfunction request(url, options) {\n return fetch(url, options).then(function (response) {\n return Promise.all([response, parseJSON(response)]);\n }).then(function (_ref) {\n var _ref2 = _slicedToArray(_ref, 2),\n response = _ref2[0],\n jsonResponse = _ref2[1];\n\n return checkStatus(response, jsonResponse);\n });\n}\n\n/***/ }),\n/* 12 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n// request actions\nvar HANDLE_SHOW_URI = exports.HANDLE_SHOW_URI = 'HANDLE_SHOW_URI';\nvar REQUEST_ERROR = exports.REQUEST_ERROR = 'REQUEST_ERROR';\nvar REQUEST_UPDATE = exports.REQUEST_UPDATE = 'REQUEST_UPDATE';\nvar ASSET_REQUEST_NEW = exports.ASSET_REQUEST_NEW = 'ASSET_REQUEST_NEW';\nvar CHANNEL_REQUEST_NEW = exports.CHANNEL_REQUEST_NEW = 'CHANNEL_REQUEST_NEW';\nvar REQUEST_LIST_ADD = exports.REQUEST_LIST_ADD = 'REQUEST_LIST_ADD';\n\n// asset actions\nvar ASSET_ADD = exports.ASSET_ADD = 'ASSET_ADD';\n\n// channel actions\nvar CHANNEL_ADD = exports.CHANNEL_ADD = 'CHANNEL_ADD';\n\nvar CHANNEL_CLAIMS_UPDATE_ASYNC = exports.CHANNEL_CLAIMS_UPDATE_ASYNC = 'CHANNEL_CLAIMS_UPDATE_ASYNC';\nvar CHANNEL_CLAIMS_UPDATE_SUCCESS = exports.CHANNEL_CLAIMS_UPDATE_SUCCESS = 'CHANNEL_CLAIMS_UPDATE_SUCCESS';\n\n// asset/file display actions\nvar FILE_REQUESTED = exports.FILE_REQUESTED = 'FILE_REQUESTED';\nvar FILE_AVAILABILITY_UPDATE = exports.FILE_AVAILABILITY_UPDATE = 'FILE_AVAILABILITY_UPDATE';\nvar DISPLAY_ASSET_ERROR = exports.DISPLAY_ASSET_ERROR = 'DISPLAY_ASSET_ERROR';\n\n/***/ }),\n/* 13 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nvar selectAsset = exports.selectAsset = function selectAsset(show) {\n var request = show.requestList[show.request.id];\n var assetKey = request.key;\n return show.assetList[assetKey];\n};\n\nvar selectShowState = exports.selectShowState = function selectShowState(state) {\n return state.show;\n};\n\n/***/ }),\n/* 14 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"react-helmet\");\n\n/***/ }),\n/* 15 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"redux-saga/effects\");\n\n/***/ }),\n/* 16 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar axios = __webpack_require__(67);\nvar logger = __webpack_require__(2);\nvar config = __webpack_require__(3);\nvar _config$api = config.api,\n apiHost = _config$api.apiHost,\n apiPort = _config$api.apiPort;\n\nvar lbryApiUri = 'http://' + apiHost + ':' + apiPort;\n\nvar _require = __webpack_require__(17),\n chooseGaLbrynetPublishLabel = _require.chooseGaLbrynetPublishLabel,\n sendGATimingEvent = _require.sendGATimingEvent;\n\nvar handleLbrynetResponse = function handleLbrynetResponse(_ref, resolve, reject) {\n var data = _ref.data;\n\n logger.debug('lbry api data:', data);\n if (data.result) {\n // check for an error\n if (data.result.error) {\n logger.debug('Lbrynet api error:', data.result.error);\n reject(new Error(data.result.error));\n return;\n };\n resolve(data.result);\n return;\n }\n // fallback in case it just timed out\n reject(JSON.stringify(data));\n};\n\nmodule.exports = {\n publishClaim: function publishClaim(publishParams) {\n logger.debug('lbryApi >> Publishing claim to \"' + publishParams.name + '\"');\n var gaStartTime = Date.now();\n return new Promise(function (resolve, reject) {\n axios.post(lbryApiUri, {\n method: 'publish',\n params: publishParams\n }).then(function (response) {\n sendGATimingEvent('lbrynet', 'publish', chooseGaLbrynetPublishLabel(publishParams), gaStartTime, Date.now());\n handleLbrynetResponse(response, resolve, reject);\n }).catch(function (error) {\n reject(error);\n });\n });\n },\n getClaim: function getClaim(uri) {\n logger.debug('lbryApi >> Getting Claim for \"' + uri + '\"');\n var gaStartTime = Date.now();\n return new Promise(function (resolve, reject) {\n axios.post(lbryApiUri, {\n method: 'get',\n params: { uri: uri, timeout: 20 }\n }).then(function (response) {\n sendGATimingEvent('lbrynet', 'getClaim', 'GET', gaStartTime, Date.now());\n handleLbrynetResponse(response, resolve, reject);\n }).catch(function (error) {\n reject(error);\n });\n });\n },\n getClaimList: function getClaimList(claimName) {\n logger.debug('lbryApi >> Getting claim_list for \"' + claimName + '\"');\n var gaStartTime = Date.now();\n return new Promise(function (resolve, reject) {\n axios.post(lbryApiUri, {\n method: 'claim_list',\n params: { name: claimName }\n }).then(function (response) {\n sendGATimingEvent('lbrynet', 'getClaimList', 'CLAIM_LIST', gaStartTime, Date.now());\n handleLbrynetResponse(response, resolve, reject);\n }).catch(function (error) {\n reject(error);\n });\n });\n },\n resolveUri: function resolveUri(uri) {\n logger.debug('lbryApi >> Resolving URI for \"' + uri + '\"');\n var gaStartTime = Date.now();\n return new Promise(function (resolve, reject) {\n axios.post(lbryApiUri, {\n method: 'resolve',\n params: { uri: uri }\n }).then(function (_ref2) {\n var data = _ref2.data;\n\n sendGATimingEvent('lbrynet', 'resolveUri', 'RESOLVE', gaStartTime, Date.now());\n if (data.result[uri].error) {\n // check for errors\n reject(data.result[uri].error);\n } else {\n // if no errors, resolve\n resolve(data.result[uri]);\n }\n }).catch(function (error) {\n reject(error);\n });\n });\n },\n getDownloadDirectory: function getDownloadDirectory() {\n logger.debug('lbryApi >> Retrieving the download directory path from lbry daemon...');\n var gaStartTime = Date.now();\n return new Promise(function (resolve, reject) {\n axios.post(lbryApiUri, {\n method: 'settings_get'\n }).then(function (_ref3) {\n var data = _ref3.data;\n\n sendGATimingEvent('lbrynet', 'getDownloadDirectory', 'SETTINGS_GET', gaStartTime, Date.now());\n if (data.result) {\n resolve(data.result.download_directory);\n } else {\n return new Error('Successfully connected to lbry daemon, but unable to retrieve the download directory.');\n }\n }).catch(function (error) {\n logger.error('Lbrynet Error:', error);\n resolve('/home/lbry/Downloads/');\n });\n });\n },\n createChannel: function createChannel(name) {\n logger.debug('lbryApi >> Creating channel for ' + name + '...');\n var gaStartTime = Date.now();\n return new Promise(function (resolve, reject) {\n axios.post(lbryApiUri, {\n method: 'channel_new',\n params: {\n channel_name: name,\n amount: 0.1\n }\n }).then(function (response) {\n sendGATimingEvent('lbrynet', 'createChannel', 'CHANNEL_NEW', gaStartTime, Date.now());\n handleLbrynetResponse(response, resolve, reject);\n }).catch(function (error) {\n reject(error);\n });\n });\n }\n};\n\n/***/ }),\n/* 17 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar logger = __webpack_require__(2);\nvar ua = __webpack_require__(68);\n\nvar _require = __webpack_require__(3),\n googleId = _require.analytics.googleId,\n siteName = _require.site.name;\n\nfunction createServeEventParams(headers, ip, originalUrl) {\n return {\n eventCategory: 'client requests',\n eventAction: 'serve request',\n eventLabel: originalUrl,\n ipOverride: ip,\n userAgentOverride: headers['user-agent']\n };\n};\n\nfunction createPublishTimingEventParams(category, variable, label, startTime, endTime) {\n var duration = endTime - startTime;\n return {\n userTimingCategory: category,\n userTimingVariableName: variable,\n userTimingTime: duration,\n userTimingLabel: label\n };\n};\n\nfunction sendGoogleAnalyticsEvent(ip, params) {\n var visitorId = ip.replace(/\\./g, '-');\n var visitor = ua(googleId, visitorId, { strictCidFormat: false, https: true });\n visitor.event(params, function (err) {\n if (err) {\n logger.error('Google Analytics Event Error >>', err);\n }\n });\n};\n\nfunction sendGoogleAnalyticsTiming(visitorId, params) {\n var visitor = ua(googleId, visitorId, { strictCidFormat: false, https: true });\n visitor.timing(params, function (err) {\n if (err) {\n logger.error('Google Analytics Event Error >>', err);\n }\n logger.debug('Timing event successfully sent to google analytics');\n });\n};\n\nmodule.exports = {\n sendGAServeEvent: function sendGAServeEvent(headers, ip, originalUrl) {\n var params = createServeEventParams(headers, ip, originalUrl);\n sendGoogleAnalyticsEvent(ip, params);\n },\n sendGATimingEvent: function sendGATimingEvent(category, variable, label, startTime, endTime) {\n var params = createPublishTimingEventParams(category, variable, label, startTime, endTime);\n sendGoogleAnalyticsTiming(siteName, params);\n },\n chooseGaLbrynetPublishLabel: function chooseGaLbrynetPublishLabel(_ref) {\n var channelName = _ref.channel_name,\n channelId = _ref.channel_id;\n\n return channelName || channelId ? 'PUBLISH_IN_CHANNEL_CLAIM' : 'PUBLISH_ANONYMOUS_CLAIM';\n }\n};\n\n/***/ }),\n/* 18 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"redux\");\n\n/***/ }),\n/* 19 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.updateLoggedInChannel = updateLoggedInChannel;\n\nvar _channel_action_types = __webpack_require__(33);\n\nvar actions = _interopRequireWildcard(_channel_action_types);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\n// export action creators\n\nfunction updateLoggedInChannel(name, shortId, longId) {\n return {\n type: actions.CHANNEL_UPDATE,\n data: {\n name: name,\n shortId: shortId,\n longId: longId\n }\n };\n};\n\n/***/ }),\n/* 20 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(10);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _ActiveStatusBar = __webpack_require__(112);\n\nvar _ActiveStatusBar2 = _interopRequireDefault(_ActiveStatusBar);\n\nvar _InactiveStatusBar = __webpack_require__(113);\n\nvar _InactiveStatusBar2 = _interopRequireDefault(_InactiveStatusBar);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar ProgressBar = function (_React$Component) {\n _inherits(ProgressBar, _React$Component);\n\n function ProgressBar(props) {\n _classCallCheck(this, ProgressBar);\n\n var _this = _possibleConstructorReturn(this, (ProgressBar.__proto__ || Object.getPrototypeOf(ProgressBar)).call(this, props));\n\n _this.state = {\n bars: [],\n index: 0,\n incrementer: 1\n };\n _this.createBars = _this.createBars.bind(_this);\n _this.startProgressBar = _this.startProgressBar.bind(_this);\n _this.updateProgressBar = _this.updateProgressBar.bind(_this);\n _this.stopProgressBar = _this.stopProgressBar.bind(_this);\n return _this;\n }\n\n _createClass(ProgressBar, [{\n key: 'componentDidMount',\n value: function componentDidMount() {\n this.createBars();\n this.startProgressBar();\n }\n }, {\n key: 'componentWillUnmount',\n value: function componentWillUnmount() {\n this.stopProgressBar();\n }\n }, {\n key: 'createBars',\n value: function createBars() {\n var bars = [];\n for (var i = 0; i <= this.props.size; i++) {\n bars.push({ isActive: false });\n }\n this.setState({ bars: bars });\n }\n }, {\n key: 'startProgressBar',\n value: function startProgressBar() {\n this.updateInterval = setInterval(this.updateProgressBar.bind(this), 300);\n }\n }, {\n key: 'updateProgressBar',\n value: function updateProgressBar() {\n var index = this.state.index;\n var incrementer = this.state.incrementer;\n var bars = this.state.bars;\n // flip incrementer if necessary, to stay in bounds\n if (index < 0 || index > this.props.size) {\n incrementer = incrementer * -1;\n index += incrementer;\n }\n // update the indexed bar\n if (incrementer > 0) {\n bars[index].isActive = true;\n } else {\n bars[index].isActive = false;\n };\n // increment index\n index += incrementer;\n // update state\n this.setState({\n bars: bars,\n incrementer: incrementer,\n index: index\n });\n }\n }, {\n key: 'stopProgressBar',\n value: function stopProgressBar() {\n clearInterval(this.updateInterval);\n }\n }, {\n key: 'render',\n value: function render() {\n return _react2.default.createElement(\n 'div',\n null,\n this.state.bars.map(function (bar, index) {\n return bar.isActive ? _react2.default.createElement(_ActiveStatusBar2.default, { key: index }) : _react2.default.createElement(_InactiveStatusBar2.default, { key: index });\n })\n );\n }\n }]);\n\n return ProgressBar;\n}(_react2.default.Component);\n\n;\n\nProgressBar.propTypes = {\n size: _propTypes2.default.number.isRequired\n};\n\nexports.default = ProgressBar;\n\n/***/ }),\n/* 21 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(10);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _NavBar = __webpack_require__(7);\n\nvar _NavBar2 = _interopRequireDefault(_NavBar);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar ErrorPage = function (_React$Component) {\n _inherits(ErrorPage, _React$Component);\n\n function ErrorPage() {\n _classCallCheck(this, ErrorPage);\n\n return _possibleConstructorReturn(this, (ErrorPage.__proto__ || Object.getPrototypeOf(ErrorPage)).apply(this, arguments));\n }\n\n _createClass(ErrorPage, [{\n key: 'render',\n value: function render() {\n var error = this.props.error;\n\n return _react2.default.createElement(\n 'div',\n null,\n _react2.default.createElement(_NavBar2.default, null),\n _react2.default.createElement(\n 'div',\n { className: 'row row--padded' },\n _react2.default.createElement(\n 'p',\n null,\n error\n )\n )\n );\n }\n }]);\n\n return ErrorPage;\n}(_react2.default.Component);\n\n;\n\nErrorPage.propTypes = {\n error: _propTypes2.default.string.isRequired\n};\n\nexports.default = ErrorPage;\n\n/***/ }),\n/* 22 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"passport\");\n\n/***/ }),\n/* 23 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = {\n returnShortId: function returnShortId(claimsArray, longId) {\n var claimIndex = void 0;\n var shortId = longId.substring(0, 1); // default short id is the first letter\n var shortIdLength = 0;\n // find the index of this claim id\n claimIndex = claimsArray.findIndex(function (element) {\n return element.claimId === longId;\n });\n if (claimIndex < 0) {\n throw new Error('claim id not found in claims list');\n }\n // get an array of all claims with lower height\n var possibleMatches = claimsArray.slice(0, claimIndex);\n // remove certificates with the same prefixes until none are left.\n while (possibleMatches.length > 0) {\n shortIdLength += 1;\n shortId = longId.substring(0, shortIdLength);\n possibleMatches = possibleMatches.filter(function (element) {\n return element.claimId && element.claimId.substring(0, shortIdLength) === shortId;\n });\n }\n return shortId;\n }\n};\n\n/***/ }),\n/* 24 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"passport-local\");\n\n/***/ }),\n/* 25 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar logger = __webpack_require__(2);\nvar fs = __webpack_require__(74);\n\nvar _require = __webpack_require__(3),\n site = _require.site,\n wallet = _require.wallet,\n publish = _require.publish;\n\nmodule.exports = {\n parsePublishApiRequestBody: function parsePublishApiRequestBody(_ref) {\n var name = _ref.name,\n nsfw = _ref.nsfw,\n license = _ref.license,\n title = _ref.title,\n description = _ref.description,\n thumbnail = _ref.thumbnail;\n\n // validate name\n if (!name) {\n throw new Error('no name field found in request');\n }\n var invalidNameCharacters = /[^A-Za-z0-9,-]/.exec(name);\n if (invalidNameCharacters) {\n throw new Error('The claim name you provided is not allowed. Only the following characters are allowed: A-Z, a-z, 0-9, and \"-\"');\n }\n // optional parameters\n nsfw = nsfw === 'true';\n license = license || null;\n title = title || null;\n description = description || null;\n thumbnail = thumbnail || null;\n // return results\n return {\n name: name,\n nsfw: nsfw,\n license: license,\n title: title,\n description: description,\n thumbnail: thumbnail\n };\n },\n parsePublishApiRequestFiles: function parsePublishApiRequestFiles(_ref2) {\n var file = _ref2.file,\n thumbnail = _ref2.thumbnail;\n\n // make sure a file was provided\n if (!file) {\n throw new Error('no file with key of [file] found in request');\n }\n if (!file.path) {\n throw new Error('no file path found');\n }\n if (!file.type) {\n throw new Error('no file type found');\n }\n if (!file.size) {\n throw new Error('no file type found');\n }\n // validate the file name\n if (/'/.test(file.name)) {\n throw new Error('apostrophes are not allowed in the file name');\n }\n // validate the file\n module.exports.validateFileTypeAndSize(file);\n // return results\n return {\n fileName: file.name,\n filePath: file.path,\n fileType: file.type,\n thumbnailFileName: thumbnail ? thumbnail.name : null,\n thumbnailFilePath: thumbnail ? thumbnail.path : null,\n thumbnailFileType: thumbnail ? thumbnail.type : null\n };\n },\n validateFileTypeAndSize: function validateFileTypeAndSize(file) {\n // check file type and size\n switch (file.type) {\n case 'image/jpeg':\n case 'image/jpg':\n case 'image/png':\n if (file.size > 10000000) {\n logger.debug('publish > file validation > .jpeg/.jpg/.png was too big');\n throw new Error('Sorry, images are limited to 10 megabytes.');\n }\n break;\n case 'image/gif':\n if (file.size > 50000000) {\n logger.debug('publish > file validation > .gif was too big');\n throw new Error('Sorry, .gifs are limited to 50 megabytes.');\n }\n break;\n case 'video/mp4':\n if (file.size > 50000000) {\n logger.debug('publish > file validation > .mp4 was too big');\n throw new Error('Sorry, videos are limited to 50 megabytes.');\n }\n break;\n default:\n logger.debug('publish > file validation > unrecognized file type');\n throw new Error('The ' + file.type + ' content type is not supported. Only, .jpeg, .png, .gif, and .mp4 files are currently supported.');\n }\n return file;\n },\n createBasicPublishParams: function createBasicPublishParams(filePath, name, title, description, license, nsfw, thumbnail) {\n logger.debug('Creating Publish Parameters');\n // provide defaults for title\n if (title === null || title.trim() === '') {\n title = name;\n }\n // provide default for description\n if (description === null || description.trim() === '') {\n description = '';\n }\n // provide default for license\n if (license === null || license.trim() === '') {\n license = ' '; // default to empty string\n }\n // create the publish params\n var publishParams = {\n name: name,\n file_path: filePath,\n bid: 0.01,\n metadata: {\n description: description,\n title: title,\n author: site.title,\n language: 'en',\n license: license,\n nsfw: nsfw\n },\n claim_address: wallet.lbryClaimAddress\n };\n // add thumbnail to channel if video\n if (thumbnail) {\n publishParams['metadata']['thumbnail'] = thumbnail;\n }\n return publishParams;\n },\n createThumbnailPublishParams: function createThumbnailPublishParams(thumbnailFilePath, claimName, license, nsfw) {\n if (!thumbnailFilePath) {\n return;\n }\n logger.debug('Creating Thumbnail Publish Parameters');\n // create the publish params\n return {\n name: claimName + '-thumb',\n file_path: thumbnailFilePath,\n bid: 0.01,\n metadata: {\n title: claimName + ' thumbnail',\n description: 'a thumbnail for ' + claimName,\n author: site.title,\n language: 'en',\n license: license,\n nsfw: nsfw\n },\n claim_address: wallet.lbryClaimAddress,\n channel_name: publish.thumbnailChannel,\n channel_id: publish.thumbnailChannelId\n };\n },\n deleteTemporaryFile: function deleteTemporaryFile(filePath) {\n fs.unlink(filePath, function (err) {\n if (err) {\n logger.error('error deleting temporary file ' + filePath);\n throw err;\n }\n logger.debug('successfully deleted ' + filePath);\n });\n },\n addGetResultsToFileData: function addGetResultsToFileData(fileInfo, getResult) {\n fileInfo.fileName = getResult.file_name;\n fileInfo.filePath = getResult.download_path;\n return fileInfo;\n },\n createFileData: function createFileData(_ref3) {\n var name = _ref3.name,\n claimId = _ref3.claimId,\n outpoint = _ref3.outpoint,\n height = _ref3.height,\n address = _ref3.address,\n nsfw = _ref3.nsfw,\n contentType = _ref3.contentType;\n\n return {\n name: name,\n claimId: claimId,\n outpoint: outpoint,\n height: height,\n address: address,\n fileName: '',\n filePath: '',\n fileType: contentType,\n nsfw: nsfw\n };\n }\n};\n\n/***/ }),\n/* 26 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar logger = __webpack_require__(2);\n\nmodule.exports = {\n handleErrorResponse: function handleErrorResponse(originalUrl, ip, error, res) {\n logger.error('Error on ' + originalUrl, module.exports.useObjectPropertiesIfNoKeys(error));\n\n var _module$exports$retur = module.exports.returnErrorMessageAndStatus(error),\n _module$exports$retur2 = _slicedToArray(_module$exports$retur, 2),\n status = _module$exports$retur2[0],\n message = _module$exports$retur2[1];\n\n res.status(status).json(module.exports.createErrorResponsePayload(status, message));\n },\n returnErrorMessageAndStatus: function returnErrorMessageAndStatus(error) {\n var status = void 0,\n message = void 0;\n // check for daemon being turned off\n if (error.code === 'ECONNREFUSED') {\n status = 503;\n message = 'Connection refused. The daemon may not be running.';\n // fallback for everything else\n } else {\n status = 400;\n if (error.message) {\n message = error.message;\n } else {\n message = error;\n };\n };\n return [status, message];\n },\n useObjectPropertiesIfNoKeys: function useObjectPropertiesIfNoKeys(err) {\n if (Object.keys(err).length === 0) {\n var newErrorObject = {};\n Object.getOwnPropertyNames(err).forEach(function (key) {\n newErrorObject[key] = err[key];\n });\n return newErrorObject;\n }\n return err;\n },\n createErrorResponsePayload: function createErrorResponsePayload(status, message) {\n return {\n status: status,\n success: false,\n message: message\n };\n }\n};\n\n/***/ }),\n/* 27 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar db = __webpack_require__(6);\nvar logger = __webpack_require__(2);\n\nvar _require = __webpack_require__(76),\n returnPaginatedChannelClaims = _require.returnPaginatedChannelClaims;\n\nvar NO_CHANNEL = 'NO_CHANNEL';\nvar NO_CLAIM = 'NO_CLAIM';\nvar NO_FILE = 'NO_FILE';\n\nmodule.exports = {\n getClaimId: function getClaimId(channelName, channelClaimId, name, claimId) {\n if (channelName) {\n return module.exports.getClaimIdByChannel(channelName, channelClaimId, name);\n } else {\n return module.exports.getClaimIdByClaim(name, claimId);\n }\n },\n getClaimIdByClaim: function getClaimIdByClaim(claimName, claimId) {\n logger.debug('getClaimIdByClaim(' + claimName + ', ' + claimId + ')');\n return new Promise(function (resolve, reject) {\n db.Claim.getLongClaimId(claimName, claimId).then(function (longClaimId) {\n if (!longClaimId) {\n resolve(NO_CLAIM);\n }\n resolve(longClaimId);\n }).catch(function (error) {\n reject(error);\n });\n });\n },\n getClaimIdByChannel: function getClaimIdByChannel(channelName, channelClaimId, claimName) {\n logger.debug('getClaimIdByChannel(' + channelName + ', ' + channelClaimId + ', ' + claimName + ')');\n return new Promise(function (resolve, reject) {\n db.Certificate.getLongChannelId(channelName, channelClaimId) // 1. get the long channel id\n .then(function (longChannelId) {\n if (!longChannelId) {\n return [null, null];\n }\n return Promise.all([longChannelId, db.Claim.getClaimIdByLongChannelId(longChannelId, claimName)]); // 2. get the long claim id\n }).then(function (_ref) {\n var _ref2 = _slicedToArray(_ref, 2),\n longChannelId = _ref2[0],\n longClaimId = _ref2[1];\n\n if (!longChannelId) {\n return resolve(NO_CHANNEL);\n }\n if (!longClaimId) {\n return resolve(NO_CLAIM);\n }\n resolve(longClaimId);\n }).catch(function (error) {\n reject(error);\n });\n });\n },\n getChannelData: function getChannelData(channelName, channelClaimId, page) {\n return new Promise(function (resolve, reject) {\n // 1. get the long channel Id (make sure channel exists)\n db.Certificate.getLongChannelId(channelName, channelClaimId).then(function (longChannelClaimId) {\n if (!longChannelClaimId) {\n return [null, null, null];\n }\n // 2. get the short ID and all claims for that channel\n return Promise.all([longChannelClaimId, db.Certificate.getShortChannelIdFromLongChannelId(longChannelClaimId, channelName)]);\n }).then(function (_ref3) {\n var _ref4 = _slicedToArray(_ref3, 2),\n longChannelClaimId = _ref4[0],\n shortChannelClaimId = _ref4[1];\n\n if (!longChannelClaimId) {\n return resolve(NO_CHANNEL);\n }\n // 3. return all the channel information\n resolve({\n channelName: channelName,\n longChannelClaimId: longChannelClaimId,\n shortChannelClaimId: shortChannelClaimId\n });\n }).catch(function (error) {\n reject(error);\n });\n });\n },\n getChannelClaims: function getChannelClaims(channelName, channelClaimId, page) {\n return new Promise(function (resolve, reject) {\n // 1. get the long channel Id (make sure channel exists)\n db.Certificate.getLongChannelId(channelName, channelClaimId).then(function (longChannelClaimId) {\n if (!longChannelClaimId) {\n return [null, null, null];\n }\n // 2. get the short ID and all claims for that channel\n return Promise.all([longChannelClaimId, db.Claim.getAllChannelClaims(longChannelClaimId)]);\n }).then(function (_ref5) {\n var _ref6 = _slicedToArray(_ref5, 2),\n longChannelClaimId = _ref6[0],\n channelClaimsArray = _ref6[1];\n\n if (!longChannelClaimId) {\n return resolve(NO_CHANNEL);\n }\n // 3. format the data for the view, including pagination\n var paginatedChannelViewData = returnPaginatedChannelClaims(channelName, longChannelClaimId, channelClaimsArray, page);\n // 4. return all the channel information and contents\n resolve(paginatedChannelViewData);\n }).catch(function (error) {\n reject(error);\n });\n });\n },\n getLocalFileRecord: function getLocalFileRecord(claimId, name) {\n return db.File.findOne({ where: { claimId: claimId, name: name } }).then(function (file) {\n if (!file) {\n return NO_FILE;\n }\n return file.dataValues;\n });\n }\n};\n\n/***/ }),\n/* 28 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _server = __webpack_require__(29);\n\nvar _redux = __webpack_require__(18);\n\nvar _reducers = __webpack_require__(30);\n\nvar _reducers2 = _interopRequireDefault(_reducers);\n\nvar _reactRedux = __webpack_require__(1);\n\nvar _reactRouterDom = __webpack_require__(4);\n\nvar _GAListener = __webpack_require__(35);\n\nvar _GAListener2 = _interopRequireDefault(_GAListener);\n\nvar _app = __webpack_require__(36);\n\nvar _app2 = _interopRequireDefault(_app);\n\nvar _renderFullPage = __webpack_require__(42);\n\nvar _renderFullPage2 = _interopRequireDefault(_renderFullPage);\n\nvar _reactHelmet = __webpack_require__(14);\n\nvar _reactHelmet2 = _interopRequireDefault(_reactHelmet);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nmodule.exports = function (req, res) {\n var context = {};\n\n // create a new Redux store instance\n var store = (0, _redux.createStore)(_reducers2.default);\n\n // render component to a string\n var html = (0, _server.renderToString)(_react2.default.createElement(\n _reactRedux.Provider,\n { store: store },\n _react2.default.createElement(\n _reactRouterDom.StaticRouter,\n { location: req.url, context: context },\n _react2.default.createElement(\n _GAListener2.default,\n null,\n _react2.default.createElement(_app2.default, null)\n )\n )\n ));\n\n // get head tags from helmet\n var helmet = _reactHelmet2.default.renderStatic();\n\n // check for a redirect\n if (context.url) {\n // Somewhere a `` was rendered\n return res.redirect(301, context.url);\n } else {}\n // we're good, send the response\n\n\n // get the initial state from our Redux store\n var preloadedState = store.getState();\n\n // send the rendered page back to the client\n res.send((0, _renderFullPage2.default)(helmet, html, preloadedState));\n};\n\n/***/ }),\n/* 29 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"react-dom/server\");\n\n/***/ }),\n/* 30 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _redux = __webpack_require__(18);\n\nvar _publish = __webpack_require__(78);\n\nvar _publish2 = _interopRequireDefault(_publish);\n\nvar _channel = __webpack_require__(79);\n\nvar _channel2 = _interopRequireDefault(_channel);\n\nvar _show = __webpack_require__(80);\n\nvar _show2 = _interopRequireDefault(_show);\n\nvar _site = __webpack_require__(81);\n\nvar _site2 = _interopRequireDefault(_site);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = (0, _redux.combineReducers)({\n channel: _channel2.default,\n publish: _publish2.default,\n show: _show2.default,\n site: _site2.default\n});\n\n/***/ }),\n/* 31 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nvar FILE_SELECTED = exports.FILE_SELECTED = 'FILE_SELECTED';\nvar FILE_CLEAR = exports.FILE_CLEAR = 'FILE_CLEAR';\nvar METADATA_UPDATE = exports.METADATA_UPDATE = 'METADATA_UPDATE';\nvar CLAIM_UPDATE = exports.CLAIM_UPDATE = 'CLAIM_UPDATE';\nvar SET_PUBLISH_IN_CHANNEL = exports.SET_PUBLISH_IN_CHANNEL = 'SET_PUBLISH_IN_CHANNEL';\nvar PUBLISH_STATUS_UPDATE = exports.PUBLISH_STATUS_UPDATE = 'PUBLISH_STATUS_UPDATE';\nvar ERROR_UPDATE = exports.ERROR_UPDATE = 'ERROR_UPDATE';\nvar SELECTED_CHANNEL_UPDATE = exports.SELECTED_CHANNEL_UPDATE = 'SELECTED_CHANNEL_UPDATE';\nvar TOGGLE_METADATA_INPUTS = exports.TOGGLE_METADATA_INPUTS = 'TOGGLE_METADATA_INPUTS';\nvar THUMBNAIL_NEW = exports.THUMBNAIL_NEW = 'THUMBNAIL_NEW';\nvar PUBLISH_START = exports.PUBLISH_START = 'PUBLISH_START';\n\n/***/ }),\n/* 32 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nvar LOGIN = exports.LOGIN = 'Existing';\nvar CREATE = exports.CREATE = 'New';\n\n/***/ }),\n/* 33 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nvar CHANNEL_UPDATE = exports.CHANNEL_UPDATE = 'CHANNEL_UPDATE';\n\n/***/ }),\n/* 34 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nvar LOCAL_CHECK = exports.LOCAL_CHECK = 'LOCAL_CHECK';\nvar UNAVAILABLE = exports.UNAVAILABLE = 'UNAVAILABLE';\nvar ERROR = exports.ERROR = 'ERROR';\nvar AVAILABLE = exports.AVAILABLE = 'AVAILABLE';\n\n/***/ }),\n/* 35 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _reactGa = __webpack_require__(82);\n\nvar _reactGa2 = _interopRequireDefault(_reactGa);\n\nvar _reactRouterDom = __webpack_require__(4);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar config = __webpack_require__(3);\nvar googleApiKey = config.analytics.googleId;\n\n_reactGa2.default.initialize(googleApiKey);\n\nvar GAListener = function (_React$Component) {\n _inherits(GAListener, _React$Component);\n\n function GAListener() {\n _classCallCheck(this, GAListener);\n\n return _possibleConstructorReturn(this, (GAListener.__proto__ || Object.getPrototypeOf(GAListener)).apply(this, arguments));\n }\n\n _createClass(GAListener, [{\n key: 'componentDidMount',\n value: function componentDidMount() {\n this.sendPageView(this.props.history.location);\n this.props.history.listen(this.sendPageView);\n }\n }, {\n key: 'sendPageView',\n value: function sendPageView(location) {\n _reactGa2.default.set({ page: location.pathname });\n _reactGa2.default.pageview(location.pathname);\n }\n }, {\n key: 'render',\n value: function render() {\n return this.props.children;\n }\n }]);\n\n return GAListener;\n}(_react2.default.Component);\n\nexports.default = (0, _reactRouterDom.withRouter)(GAListener);\n\n/***/ }),\n/* 36 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _reactRouterDom = __webpack_require__(4);\n\nvar _HomePage = __webpack_require__(83);\n\nvar _HomePage2 = _interopRequireDefault(_HomePage);\n\nvar _AboutPage = __webpack_require__(117);\n\nvar _AboutPage2 = _interopRequireDefault(_AboutPage);\n\nvar _LoginPage = __webpack_require__(118);\n\nvar _LoginPage2 = _interopRequireDefault(_LoginPage);\n\nvar _ShowPage = __webpack_require__(120);\n\nvar _ShowPage2 = _interopRequireDefault(_ShowPage);\n\nvar _FourOhFourPage = __webpack_require__(136);\n\nvar _FourOhFourPage2 = _interopRequireDefault(_FourOhFourPage);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar App = function App() {\n return _react2.default.createElement(\n _reactRouterDom.Switch,\n null,\n _react2.default.createElement(_reactRouterDom.Route, { exact: true, path: '/', component: _HomePage2.default }),\n _react2.default.createElement(_reactRouterDom.Route, { exact: true, path: '/about', component: _AboutPage2.default }),\n _react2.default.createElement(_reactRouterDom.Route, { exact: true, path: '/login', component: _LoginPage2.default }),\n _react2.default.createElement(_reactRouterDom.Route, { exact: true, path: '/:identifier/:claim', component: _ShowPage2.default }),\n _react2.default.createElement(_reactRouterDom.Route, { exact: true, path: '/:claim', component: _ShowPage2.default }),\n _react2.default.createElement(_reactRouterDom.Route, { component: _FourOhFourPage2.default })\n );\n};\n\nexports.default = App;\n\n/***/ }),\n/* 37 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _reactRedux = __webpack_require__(1);\n\nvar _publish = __webpack_require__(5);\n\nvar _view = __webpack_require__(93);\n\nvar _view2 = _interopRequireDefault(_view);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar mapStateToProps = function mapStateToProps(_ref) {\n var publish = _ref.publish;\n\n return {\n file: publish.file,\n thumbnail: publish.thumbnail,\n fileError: publish.error.file\n };\n};\n\nvar mapDispatchToProps = function mapDispatchToProps(dispatch) {\n return {\n selectFile: function selectFile(file) {\n dispatch((0, _publish.selectFile)(file));\n },\n setFileError: function setFileError(value) {\n dispatch((0, _publish.clearFile)());\n dispatch((0, _publish.updateError)('file', value));\n }\n };\n};\n\nexports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(_view2.default);\n\n/***/ }),\n/* 38 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _reactRedux = __webpack_require__(1);\n\nvar _channel = __webpack_require__(19);\n\nvar _view = __webpack_require__(110);\n\nvar _view2 = _interopRequireDefault(_view);\n\nvar _publish = __webpack_require__(5);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar mapDispatchToProps = function mapDispatchToProps(dispatch) {\n return {\n onChannelLogin: function onChannelLogin(name, shortId, longId) {\n dispatch((0, _channel.updateLoggedInChannel)(name, shortId, longId));\n dispatch((0, _publish.updateSelectedChannel)(name));\n }\n };\n};\n\nexports.default = (0, _reactRedux.connect)(null, mapDispatchToProps)(_view2.default);\n\n/***/ }),\n/* 39 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _reactRedux = __webpack_require__(1);\n\nvar _channel = __webpack_require__(19);\n\nvar _view = __webpack_require__(111);\n\nvar _view2 = _interopRequireDefault(_view);\n\nvar _publish = __webpack_require__(5);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar mapDispatchToProps = function mapDispatchToProps(dispatch) {\n return {\n onChannelLogin: function onChannelLogin(name, shortId, longId) {\n dispatch((0, _channel.updateLoggedInChannel)(name, shortId, longId));\n dispatch((0, _publish.updateSelectedChannel)(name));\n }\n };\n};\n\nexports.default = (0, _reactRedux.connect)(null, mapDispatchToProps)(_view2.default);\n\n/***/ }),\n/* 40 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nvar CHANNEL = exports.CHANNEL = 'CHANNEL';\nvar ASSET_LITE = exports.ASSET_LITE = 'ASSET_LITE';\nvar ASSET_DETAILS = exports.ASSET_DETAILS = 'ASSET_DETAILS';\n\n/***/ }),\n/* 41 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _reactRedux = __webpack_require__(1);\n\nvar _view = __webpack_require__(124);\n\nvar _view2 = _interopRequireDefault(_view);\n\nvar _show = __webpack_require__(8);\n\nvar _show2 = __webpack_require__(13);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar mapStateToProps = function mapStateToProps(_ref) {\n var show = _ref.show;\n\n // select error and status\n var error = show.displayAsset.error;\n var status = show.displayAsset.status;\n // select asset\n var asset = (0, _show2.selectAsset)(show);\n // return props\n return {\n error: error,\n status: status,\n asset: asset\n };\n};\n\nvar mapDispatchToProps = function mapDispatchToProps(dispatch) {\n return {\n onFileRequest: function onFileRequest(name, claimId) {\n dispatch((0, _show.fileRequested)(name, claimId));\n }\n };\n};\n\nexports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(_view2.default);\n\n/***/ }),\n/* 42 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = function (helmet, html, preloadedState) {\n // take the html and preloadedState and return the full page\n return '\\n \\n \\n \\n \\n \\n \\n \\n ' + helmet.title.toString() + '\\n ' + helmet.meta.toString() + '\\n ' + helmet.link.toString() + '\\n \\n \\n \\n \\n \\n \\n \\n \\n
\\n
' + html + '
\\n
\\n \\n \\n \\n \\n ';\n};\n\n/***/ }),\n/* 43 */\n/***/ (function(module, exports, __webpack_require__) {\n\n__webpack_require__(44);\n__webpack_require__(45);\nmodule.exports = __webpack_require__(46);\n\n\n/***/ }),\n/* 44 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"babel-polyfill\");\n\n/***/ }),\n/* 45 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"whatwg-fetch\");\n\n/***/ }),\n/* 46 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\n// load dependencies\nvar express = __webpack_require__(47);\nvar bodyParser = __webpack_require__(48);\nvar expressHandlebars = __webpack_require__(49);\nvar Handlebars = __webpack_require__(50);\n\nvar _require = __webpack_require__(51),\n populateLocalsDotUser = _require.populateLocalsDotUser,\n serializeSpeechUser = _require.serializeSpeechUser,\n deserializeSpeechUser = _require.deserializeSpeechUser;\n\nvar config = __webpack_require__(3);\nvar logger = __webpack_require__(2);\nvar helmet = __webpack_require__(52);\nvar PORT = 3000; // set port\nvar app = express(); // create an Express application\nvar passport = __webpack_require__(22);\nvar cookieSession = __webpack_require__(53);\n\n// configure logging\nvar logLevel = config.logging.logLevel;\n__webpack_require__(54)(logger, logLevel);\n__webpack_require__(55)(logger);\n\n// check for global config variables\n__webpack_require__(57)();\n\n// trust the proxy to get ip address for us\napp.enable('trust proxy');\n\n// add middleware\napp.use(helmet()); // set HTTP headers to protect against well-known web vulnerabilties\napp.use(express.static(__dirname + '/public')); // 'express.static' to serve static files from public directory\napp.use(bodyParser.json()); // 'body parser' for parsing application/json\napp.use(bodyParser.urlencoded({ extended: true })); // 'body parser' for parsing application/x-www-form-urlencoded\napp.use(function (req, res, next) {\n // custom logging middleware to log all incoming http requests\n logger.verbose('Request on ' + req.originalUrl + ' from ' + req.ip);\n next();\n});\n\n// configure passport\npassport.serializeUser(serializeSpeechUser);\npassport.deserializeUser(deserializeSpeechUser);\nvar localSignupStrategy = __webpack_require__(58);\nvar localLoginStrategy = __webpack_require__(69);\npassport.use('local-signup', localSignupStrategy);\npassport.use('local-login', localLoginStrategy);\n// initialize passport\napp.use(cookieSession({\n name: 'session',\n keys: [config.session.sessionKey],\n maxAge: 24 * 60 * 60 * 1000 // 24 hours\n}));\napp.use(passport.initialize());\napp.use(passport.session());\n\n// configure handlebars & register it with express app\nvar hbs = expressHandlebars.create({\n defaultLayout: 'embed', // sets the default layout\n handlebars: Handlebars // includes basic handlebars for access to that library\n});\napp.engine('handlebars', hbs.engine);\napp.set('view engine', 'handlebars');\n\n// middleware to pass user info back to client (for handlebars access), if user is logged in\napp.use(populateLocalsDotUser);\n\n// start the server\nvar startServer = function startServer(mysqlConfig) {\n var db = __webpack_require__(6)(mysqlConfig); // require our models for syncing\n db.sequelize\n // sync sequelize\n .sync()\n // require routes\n .then(function () {\n __webpack_require__(70)(app);\n __webpack_require__(71)(app);\n __webpack_require__(77)(app);\n __webpack_require__(137)(app);\n __webpack_require__(148)(app);\n var http = __webpack_require__(149);\n return http.Server(app);\n })\n // start the server\n .then(function (server) {\n server.listen(PORT, function () {\n logger.info('Trusting proxy?', app.get('trust proxy'));\n logger.info('Server is listening on PORT ' + PORT);\n });\n }).catch(function (error) {\n logger.error('Startup Error:', error);\n });\n};\n\nmodule.exports = {\n hello: function hello() {\n console.log('hello world');\n },\n speak: function speak(something) {\n console.log(something);\n }\n};\n\n/***/ }),\n/* 47 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"express\");\n\n/***/ }),\n/* 48 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"body-parser\");\n\n/***/ }),\n/* 49 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"express-handlebars\");\n\n/***/ }),\n/* 50 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"handlebars\");\n\n/***/ }),\n/* 51 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\n// const db = require('../models'); // require our models for syncing\nvar logger = __webpack_require__(2);\n\nmodule.exports = {\n populateLocalsDotUser: function populateLocalsDotUser(req, res, next) {\n if (req.user) {\n logger.debug('populating res.locals.user');\n res.locals.user = {\n id: req.user.id,\n userName: req.user.userName,\n channelName: req.user.channelName,\n channelClaimId: req.user.channelClaimId,\n shortChannelId: req.user.shortChannelId\n };\n }\n next();\n },\n serializeSpeechUser: function serializeSpeechUser(user, done) {\n // returns user data to be serialized into session\n logger.debug('serializing user');\n done(null, user);\n },\n deserializeSpeechUser: function deserializeSpeechUser(user, done) {\n // deserializes session and populates additional info to req.user\n logger.debug('deserializing user');\n done(null, user);\n }\n};\n\n/***/ }),\n/* 52 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"helmet\");\n\n/***/ }),\n/* 53 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"cookie-session\");\n\n/***/ }),\n/* 54 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = function (winston, logLevel) {\n winston.configure({\n transports: [new winston.transports.Console({\n level: logLevel,\n timestamp: false,\n colorize: true,\n prettyPrint: true,\n handleExceptions: true,\n humanReadableUnhandledException: true\n })]\n });\n\n winston.error('Level 0');\n winston.warn('Level 1');\n winston.info('Level 2');\n winston.verbose('Level 3');\n winston.debug('Level 4');\n winston.silly('Level 5');\n};\n\n/***/ }),\n/* 55 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _require = __webpack_require__(3),\n logging = _require.logging;\n\nvar slackWebHook = logging.slackWebHook,\n slackErrorChannel = logging.slackErrorChannel,\n slackInfoChannel = logging.slackInfoChannel;\n\nvar winstonSlackWebHook = __webpack_require__(56).SlackWebHook;\n\nmodule.exports = function (winston) {\n if (slackWebHook) {\n // add a transport for errors to slack\n if (slackErrorChannel) {\n winston.add(winstonSlackWebHook, {\n name: 'slack-errors-transport',\n level: 'warn',\n webhookUrl: slackWebHook,\n channel: slackErrorChannel,\n username: 'spee.ch',\n iconEmoji: ':face_with_head_bandage:'\n });\n };\n if (slackInfoChannel) {\n winston.add(winstonSlackWebHook, {\n name: 'slack-info-transport',\n level: 'info',\n webhookUrl: slackWebHook,\n channel: slackInfoChannel,\n username: 'spee.ch',\n iconEmoji: ':nerd_face:'\n });\n };\n // send test message\n winston.error('Slack \"error\" logging is online.');\n winston.info('Slack \"info\" logging is online.');\n } else {\n winston.warn('Slack logging is not enabled because no slackWebHook config var provided.');\n }\n};\n\n/***/ }),\n/* 56 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"winston-slack-webhook\");\n\n/***/ }),\n/* 57 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar config = __webpack_require__(3);\nvar logger = __webpack_require__(2);\n\nmodule.exports = function () {\n // get the config file\n\n for (var configCategoryKey in config) {\n if (config.hasOwnProperty(configCategoryKey)) {\n // get the final variables for each config category\n var configVariables = config[configCategoryKey];\n for (var configVarKey in configVariables) {\n if (configVariables.hasOwnProperty(configVarKey)) {\n // print each variable\n logger.debug('CONFIG CHECK: ' + configCategoryKey + '.' + configVarKey + ' === ' + configVariables[configVarKey]);\n }\n }\n }\n }\n};\n\n/***/ }),\n/* 58 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar db = __webpack_require__(6);\nvar PassportLocalStrategy = __webpack_require__(24).Strategy;\nvar lbryApi = __webpack_require__(16);\nvar logger = __webpack_require__(2);\n\nmodule.exports = new PassportLocalStrategy({\n usernameField: 'username',\n passwordField: 'password'\n}, function (username, password, done) {\n logger.verbose('new channel signup request. user: ' + username + ' pass: ' + password + ' .');\n var userInfo = {};\n // server-side validaton of inputs (username, password)\n\n // create the channel and retrieve the metadata\n return lbryApi.createChannel('@' + username).then(function (tx) {\n // create user record\n var userData = {\n userName: username,\n password: password\n };\n logger.verbose('userData >', userData);\n // create user record\n var channelData = {\n channelName: '@' + username,\n channelClaimId: tx.claim_id\n };\n logger.verbose('channelData >', channelData);\n // create certificate record\n var certificateData = {\n claimId: tx.claim_id,\n name: '@' + username\n // address,\n };\n logger.verbose('certificateData >', certificateData);\n // save user and certificate to db\n return Promise.all([db.User.create(userData), db.Channel.create(channelData), db.Certificate.create(certificateData)]);\n }).then(function (_ref) {\n var _ref2 = _slicedToArray(_ref, 3),\n newUser = _ref2[0],\n newChannel = _ref2[1],\n newCertificate = _ref2[2];\n\n logger.verbose('user and certificate successfully created');\n // store the relevant newUser info to be passed back for req.User\n userInfo['id'] = newUser.id;\n userInfo['userName'] = newUser.userName;\n userInfo['channelName'] = newChannel.channelName;\n userInfo['channelClaimId'] = newChannel.channelClaimId;\n // associate the instances\n return Promise.all([newCertificate.setChannel(newChannel), newChannel.setUser(newUser)]);\n }).then(function () {\n logger.verbose('user and certificate successfully associated');\n return db.Certificate.getShortChannelIdFromLongChannelId(userInfo.channelClaimId, userInfo.channelName);\n }).then(function (shortChannelId) {\n userInfo['shortChannelId'] = shortChannelId;\n return done(null, userInfo);\n }).catch(function (error) {\n logger.error('signup error', error);\n return done(error);\n });\n});\n\n/***/ }),\n/* 59 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"sequelize\");\n\n/***/ }),\n/* 60 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar logger = __webpack_require__(2);\n\nvar _require = __webpack_require__(23),\n returnShortId = _require.returnShortId;\n\nmodule.exports = function (sequelize, _ref) {\n var STRING = _ref.STRING,\n BOOLEAN = _ref.BOOLEAN,\n INTEGER = _ref.INTEGER,\n TEXT = _ref.TEXT,\n DECIMAL = _ref.DECIMAL;\n\n var Certificate = sequelize.define('Certificate', {\n address: {\n type: STRING,\n default: null\n },\n amount: {\n type: DECIMAL(19, 8),\n default: null\n },\n claimId: {\n type: STRING,\n default: null\n },\n claimSequence: {\n type: INTEGER,\n default: null\n },\n decodedClaim: {\n type: BOOLEAN,\n default: null\n },\n depth: {\n type: INTEGER,\n default: null\n },\n effectiveAmount: {\n type: DECIMAL(19, 8),\n default: null\n },\n hasSignature: {\n type: BOOLEAN,\n default: null\n },\n height: {\n type: INTEGER,\n default: null\n },\n hex: {\n type: TEXT('long'),\n default: null\n },\n name: {\n type: STRING,\n default: null\n },\n nout: {\n type: INTEGER,\n default: null\n },\n txid: {\n type: STRING,\n default: null\n },\n validAtHeight: {\n type: INTEGER,\n default: null\n },\n outpoint: {\n type: STRING,\n default: null\n },\n valueVersion: {\n type: STRING,\n default: null\n },\n claimType: {\n type: STRING,\n default: null\n },\n certificateVersion: {\n type: STRING,\n default: null\n },\n keyType: {\n type: STRING,\n default: null\n },\n publicKey: {\n type: TEXT('long'),\n default: null\n }\n }, {\n freezeTableName: true\n });\n\n Certificate.associate = function (db) {\n Certificate.belongsTo(db.Channel, {\n foreignKey: {\n allowNull: true\n }\n });\n };\n\n Certificate.getShortChannelIdFromLongChannelId = function (longChannelId, channelName) {\n var _this = this;\n\n logger.debug('getShortChannelIdFromLongChannelId ' + channelName + ':' + longChannelId);\n return new Promise(function (resolve, reject) {\n _this.findAll({\n where: { name: channelName },\n order: [['height', 'ASC']]\n }).then(function (result) {\n switch (result.length) {\n case 0:\n throw new Error('No channel(s) found with that channel name');\n default:\n return resolve(returnShortId(result, longChannelId));\n }\n }).catch(function (error) {\n reject(error);\n });\n });\n };\n\n Certificate.getLongChannelIdFromShortChannelId = function (channelName, channelClaimId) {\n var _this2 = this;\n\n logger.debug('getLongChannelIdFromShortChannelId(' + channelName + ', ' + channelClaimId + ')');\n return new Promise(function (resolve, reject) {\n _this2.findAll({\n where: {\n name: channelName,\n claimId: {\n $like: channelClaimId + '%'\n }\n },\n order: [['height', 'ASC']]\n }).then(function (result) {\n switch (result.length) {\n case 0:\n return resolve(null);\n default:\n // note results must be sorted\n return resolve(result[0].claimId);\n }\n }).catch(function (error) {\n reject(error);\n });\n });\n };\n\n Certificate.getLongChannelIdFromChannelName = function (channelName) {\n var _this3 = this;\n\n logger.debug('getLongChannelIdFromChannelName(' + channelName + ')');\n return new Promise(function (resolve, reject) {\n _this3.findAll({\n where: { name: channelName },\n order: [['effectiveAmount', 'DESC'], ['height', 'ASC']]\n }).then(function (result) {\n switch (result.length) {\n case 0:\n return resolve(null);\n default:\n return resolve(result[0].claimId);\n }\n }).catch(function (error) {\n reject(error);\n });\n });\n };\n\n Certificate.validateLongChannelId = function (name, claimId) {\n var _this4 = this;\n\n logger.debug('validateLongChannelId(' + name + ', ' + claimId + ')');\n return new Promise(function (resolve, reject) {\n _this4.findOne({\n where: { name: name, claimId: claimId }\n }).then(function (result) {\n if (!result) {\n return resolve(null);\n };\n resolve(claimId);\n }).catch(function (error) {\n reject(error);\n });\n });\n };\n\n Certificate.getLongChannelId = function (channelName, channelClaimId) {\n logger.debug('getLongChannelId(' + channelName + ', ' + channelClaimId + ')');\n if (channelClaimId && channelClaimId.length === 40) {\n // if a full channel id is provided\n return this.validateLongChannelId(channelName, channelClaimId);\n } else if (channelClaimId && channelClaimId.length < 40) {\n // if a short channel id is provided\n return this.getLongChannelIdFromShortChannelId(channelName, channelClaimId);\n } else {\n return this.getLongChannelIdFromChannelName(channelName); // if no channel id provided\n }\n };\n\n return Certificate;\n};\n\n/***/ }),\n/* 61 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = function (sequelize, _ref) {\n var STRING = _ref.STRING;\n\n var Channel = sequelize.define('Channel', {\n channelName: {\n type: STRING,\n allowNull: false\n },\n channelClaimId: {\n type: STRING,\n allowNull: false\n }\n }, {\n freezeTableName: true\n });\n\n Channel.associate = function (db) {\n Channel.belongsTo(db.User);\n Channel.hasOne(db.Certificate);\n };\n\n return Channel;\n};\n\n/***/ }),\n/* 62 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar logger = __webpack_require__(2);\n\nvar _require = __webpack_require__(23),\n returnShortId = _require.returnShortId;\n\nvar _require2 = __webpack_require__(3),\n claim = _require2.claim,\n site = _require2.site;\n\nvar defaultThumbnail = claim.defaultThumbnail;\n\n\nfunction determineFileExtensionFromContentType(contentType) {\n switch (contentType) {\n case 'image/jpeg':\n case 'image/jpg':\n return 'jpeg';\n case 'image/png':\n return 'png';\n case 'image/gif':\n return 'gif';\n case 'video/mp4':\n return 'mp4';\n default:\n logger.debug('setting unknown file type as file extension jpeg');\n return 'jpeg';\n }\n};\n\nfunction determineThumbnail(storedThumbnail, defaultThumbnail) {\n if (storedThumbnail === '') {\n return defaultThumbnail;\n }\n return storedThumbnail;\n};\n\nfunction prepareClaimData(claim) {\n // logger.debug('preparing claim data based on resolved data:', claim);\n claim['thumbnail'] = determineThumbnail(claim.thumbnail, defaultThumbnail);\n claim['fileExt'] = determineFileExtensionFromContentType(claim.contentType);\n claim['host'] = site.host;\n return claim;\n};\n\nmodule.exports = function (sequelize, _ref) {\n var STRING = _ref.STRING,\n BOOLEAN = _ref.BOOLEAN,\n INTEGER = _ref.INTEGER,\n TEXT = _ref.TEXT,\n DECIMAL = _ref.DECIMAL;\n\n var Claim = sequelize.define('Claim', {\n address: {\n type: STRING,\n default: null\n },\n amount: {\n type: DECIMAL(19, 8),\n default: null\n },\n claimId: {\n type: STRING,\n default: null\n },\n claimSequence: {\n type: INTEGER,\n default: null\n },\n decodedClaim: {\n type: BOOLEAN,\n default: null\n },\n depth: {\n type: INTEGER,\n default: null\n },\n effectiveAmount: {\n type: DECIMAL(19, 8),\n default: null\n },\n hasSignature: {\n type: BOOLEAN,\n default: null\n },\n height: {\n type: INTEGER,\n default: null\n },\n hex: {\n type: TEXT('long'),\n default: null\n },\n name: {\n type: STRING,\n default: null\n },\n nout: {\n type: INTEGER,\n default: null\n },\n txid: {\n type: STRING,\n default: null\n },\n validAtHeight: {\n type: INTEGER,\n default: null\n },\n outpoint: {\n type: STRING,\n default: null\n },\n claimType: {\n type: STRING,\n default: null\n },\n certificateId: {\n type: STRING,\n default: null\n },\n author: {\n type: STRING,\n default: null\n },\n description: {\n type: TEXT('long'),\n default: null\n },\n language: {\n type: STRING,\n default: null\n },\n license: {\n type: STRING,\n default: null\n },\n licenseUrl: {\n type: STRING,\n default: null\n },\n nsfw: {\n type: BOOLEAN,\n default: null\n },\n preview: {\n type: STRING,\n default: null\n },\n thumbnail: {\n type: STRING,\n default: null\n },\n title: {\n type: STRING,\n default: null\n },\n metadataVersion: {\n type: STRING,\n default: null\n },\n contentType: {\n type: STRING,\n default: null\n },\n source: {\n type: STRING,\n default: null\n },\n sourceType: {\n type: STRING,\n default: null\n },\n sourceVersion: {\n type: STRING,\n default: null\n },\n streamVersion: {\n type: STRING,\n default: null\n },\n valueVersion: {\n type: STRING,\n default: null\n },\n channelName: {\n type: STRING,\n allowNull: true,\n default: null\n }\n }, {\n freezeTableName: true\n });\n\n Claim.associate = function (db) {\n Claim.belongsTo(db.File, {\n foreignKey: {\n allowNull: true\n }\n });\n };\n\n Claim.getShortClaimIdFromLongClaimId = function (claimId, claimName) {\n var _this = this;\n\n logger.debug('Claim.getShortClaimIdFromLongClaimId for ' + claimName + '#' + claimId);\n return new Promise(function (resolve, reject) {\n _this.findAll({\n where: { name: claimName },\n order: [['height', 'ASC']]\n }).then(function (result) {\n switch (result.length) {\n case 0:\n throw new Error('No claim(s) found with that claim name');\n default:\n resolve(returnShortId(result, claimId));\n }\n }).catch(function (error) {\n reject(error);\n });\n });\n };\n\n Claim.getAllChannelClaims = function (channelClaimId) {\n var _this2 = this;\n\n logger.debug('Claim.getAllChannelClaims for ' + channelClaimId);\n return new Promise(function (resolve, reject) {\n _this2.findAll({\n where: { certificateId: channelClaimId },\n order: [['height', 'ASC']],\n raw: true // returns an array of only data, not an array of instances\n }).then(function (channelClaimsArray) {\n // logger.debug('channelclaimsarray length:', channelClaimsArray.length);\n switch (channelClaimsArray.length) {\n case 0:\n return resolve(null);\n default:\n channelClaimsArray.forEach(function (claim) {\n claim['fileExt'] = determineFileExtensionFromContentType(claim.contentType);\n claim['thumbnail'] = determineThumbnail(claim.thumbnail, defaultThumbnail);\n return claim;\n });\n return resolve(channelClaimsArray);\n }\n }).catch(function (error) {\n reject(error);\n });\n });\n };\n\n Claim.getClaimIdByLongChannelId = function (channelClaimId, claimName) {\n var _this3 = this;\n\n logger.debug('finding claim id for claim ' + claimName + ' from channel ' + channelClaimId);\n return new Promise(function (resolve, reject) {\n _this3.findAll({\n where: { name: claimName, certificateId: channelClaimId },\n order: [['id', 'ASC']]\n }).then(function (result) {\n switch (result.length) {\n case 0:\n return resolve(null);\n case 1:\n return resolve(result[0].claimId);\n default:\n logger.error(result.length + ' records found for \"' + claimName + '\" in channel \"' + channelClaimId + '\"');\n return resolve(result[0].claimId);\n }\n }).catch(function (error) {\n reject(error);\n });\n });\n };\n\n Claim.getLongClaimIdFromShortClaimId = function (name, shortId) {\n var _this4 = this;\n\n return new Promise(function (resolve, reject) {\n _this4.findAll({\n where: {\n name: name,\n claimId: {\n $like: shortId + '%'\n } },\n order: [['height', 'ASC']]\n }).then(function (result) {\n switch (result.length) {\n case 0:\n return resolve(null);\n default:\n // note results must be sorted\n return resolve(result[0].claimId);\n }\n }).catch(function (error) {\n reject(error);\n });\n });\n };\n\n Claim.getTopFreeClaimIdByClaimName = function (name) {\n var _this5 = this;\n\n return new Promise(function (resolve, reject) {\n _this5.findAll({\n where: { name: name },\n order: [['effectiveAmount', 'DESC'], ['height', 'ASC']] // note: maybe height and effective amount need to switch?\n }).then(function (result) {\n logger.debug('length of result', result.length);\n switch (result.length) {\n case 0:\n return resolve(null);\n default:\n return resolve(result[0].dataValues.claimId);\n }\n }).catch(function (error) {\n reject(error);\n });\n });\n };\n\n Claim.validateLongClaimId = function (name, claimId) {\n var _this6 = this;\n\n return new Promise(function (resolve, reject) {\n _this6.findOne({\n where: { name: name, claimId: claimId }\n }).then(function (result) {\n if (!result) {\n return resolve(null);\n };\n resolve(claimId);\n }).catch(function (error) {\n reject(error);\n });\n });\n };\n\n Claim.getLongClaimId = function (claimName, claimId) {\n logger.debug('getLongClaimId(' + claimName + ', ' + claimId + ')');\n if (claimId && claimId.length === 40) {\n // if a full claim id is provided\n return this.validateLongClaimId(claimName, claimId);\n } else if (claimId && claimId.length < 40) {\n return this.getLongClaimIdFromShortClaimId(claimName, claimId); // if a short claim id is provided\n } else {\n return this.getTopFreeClaimIdByClaimName(claimName); // if no claim id is provided\n }\n };\n\n Claim.resolveClaim = function (name, claimId) {\n var _this7 = this;\n\n logger.debug('Claim.resolveClaim: ' + name + ' ' + claimId);\n return new Promise(function (resolve, reject) {\n _this7.findAll({\n where: { name: name, claimId: claimId }\n }).then(function (claimArray) {\n logger.debug('claims found on resolve:', claimArray.length);\n switch (claimArray.length) {\n case 0:\n return resolve(null);\n case 1:\n return resolve(prepareClaimData(claimArray[0].dataValues));\n default:\n logger.error('more than one entry matches that name (' + name + ') and claimID (' + claimId + ')');\n return resolve(prepareClaimData(claimArray[0].dataValues));\n }\n }).catch(function (error) {\n reject(error);\n });\n });\n };\n\n return Claim;\n};\n\n/***/ }),\n/* 63 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = function (sequelize, _ref) {\n var STRING = _ref.STRING,\n BOOLEAN = _ref.BOOLEAN,\n INTEGER = _ref.INTEGER;\n\n var File = sequelize.define('File', {\n name: {\n type: STRING,\n allowNull: false\n },\n claimId: {\n type: STRING,\n allowNull: false\n },\n address: {\n type: STRING,\n allowNull: false\n },\n outpoint: {\n type: STRING,\n allowNull: false\n },\n height: {\n type: INTEGER,\n allowNull: false,\n default: 0\n },\n fileName: {\n type: STRING,\n allowNull: false\n },\n filePath: {\n type: STRING,\n allowNull: false\n },\n fileType: {\n type: STRING\n },\n nsfw: {\n type: BOOLEAN,\n allowNull: false,\n defaultValue: false\n },\n trendingEligible: {\n type: BOOLEAN,\n allowNull: false,\n defaultValue: true\n }\n }, {\n freezeTableName: true\n });\n\n File.associate = function (db) {\n File.hasMany(db.Request);\n File.hasOne(db.Claim);\n };\n\n File.getRecentClaims = function () {\n return this.findAll({\n where: { nsfw: false, trendingEligible: true },\n order: [['createdAt', 'DESC']],\n limit: 25\n });\n };\n\n return File;\n};\n\n/***/ }),\n/* 64 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = function (sequelize, _ref) {\n var STRING = _ref.STRING,\n BOOLEAN = _ref.BOOLEAN,\n TEXT = _ref.TEXT;\n\n var Request = sequelize.define('Request', {\n action: {\n type: STRING,\n allowNull: false\n },\n url: {\n type: STRING,\n allowNull: false\n },\n ipAddress: {\n type: STRING,\n allowNull: true\n },\n result: {\n type: TEXT('long'),\n allowNull: true,\n default: null\n }\n }, {\n freezeTableName: true\n });\n\n Request.associate = function (db) {\n Request.belongsTo(db.File, {\n foreignKey: {\n allowNull: true\n }\n });\n };\n\n return Request;\n};\n\n/***/ }),\n/* 65 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar bcrypt = __webpack_require__(66);\nvar logger = __webpack_require__(2);\n\nmodule.exports = function (sequelize, _ref) {\n var STRING = _ref.STRING;\n\n var User = sequelize.define('User', {\n userName: {\n type: STRING,\n allowNull: false\n },\n password: {\n type: STRING,\n allowNull: false\n }\n }, {\n freezeTableName: true\n });\n\n User.associate = function (db) {\n User.hasOne(db.Channel);\n };\n\n User.prototype.comparePassword = function (password) {\n return bcrypt.compare(password, this.password);\n };\n\n User.prototype.changePassword = function (newPassword) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n // generate a salt string to use for hashing\n bcrypt.genSalt(function (saltError, salt) {\n if (saltError) {\n logger.error('salt error', saltError);\n reject(saltError);\n return;\n }\n // generate a hashed version of the user's password\n bcrypt.hash(newPassword, salt, function (hashError, hash) {\n // if there is an error with the hash generation return the error\n if (hashError) {\n logger.error('hash error', hashError);\n reject(hashError);\n return;\n }\n // replace the current password with the new hash\n _this.update({ password: hash }).then(function () {\n resolve();\n }).catch(function (error) {\n reject(error);\n });\n });\n });\n });\n };\n\n // pre-save hook method to hash the user's password before the user's info is saved to the db.\n User.hook('beforeCreate', function (user, options) {\n logger.debug('User.beforeCreate hook...');\n return new Promise(function (resolve, reject) {\n // generate a salt string to use for hashing\n bcrypt.genSalt(function (saltError, salt) {\n if (saltError) {\n logger.error('salt error', saltError);\n reject(saltError);\n return;\n }\n // generate a hashed version of the user's password\n bcrypt.hash(user.password, salt, function (hashError, hash) {\n // if there is an error with the hash generation return the error\n if (hashError) {\n logger.error('hash error', hashError);\n reject(hashError);\n return;\n }\n // replace the password string with the hash password value\n user.password = hash;\n resolve();\n });\n });\n });\n });\n\n return User;\n};\n\n/***/ }),\n/* 66 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"bcrypt\");\n\n/***/ }),\n/* 67 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"axios\");\n\n/***/ }),\n/* 68 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"universal-analytics\");\n\n/***/ }),\n/* 69 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar PassportLocalStrategy = __webpack_require__(24).Strategy;\nvar db = __webpack_require__(6);\nvar logger = __webpack_require__(2);\n\nfunction returnUserAndChannelInfo(userInstance) {\n return new Promise(function (resolve, reject) {\n var userInfo = {};\n userInfo['id'] = userInstance.id;\n userInfo['userName'] = userInstance.userName;\n userInstance.getChannel().then(function (_ref) {\n var channelName = _ref.channelName,\n channelClaimId = _ref.channelClaimId;\n\n userInfo['channelName'] = channelName;\n userInfo['channelClaimId'] = channelClaimId;\n return db.Certificate.getShortChannelIdFromLongChannelId(channelClaimId, channelName);\n }).then(function (shortChannelId) {\n userInfo['shortChannelId'] = shortChannelId;\n resolve(userInfo);\n }).catch(function (error) {\n reject(error);\n });\n });\n}\n\nmodule.exports = new PassportLocalStrategy({\n usernameField: 'username',\n passwordField: 'password'\n}, function (username, password, done) {\n return db.User.findOne({\n where: { userName: username }\n }).then(function (user) {\n if (!user) {\n logger.debug('no user found');\n return done(null, false, { message: 'Incorrect username or password' });\n }\n return user.comparePassword(password).then(function (isMatch) {\n if (!isMatch) {\n logger.debug('incorrect password');\n return done(null, false, { message: 'Incorrect username or password' });\n }\n logger.debug('Password was a match, returning User');\n return returnUserAndChannelInfo(user).then(function (userInfo) {\n return done(null, userInfo);\n }).catch(function (error) {\n return error;\n });\n }).catch(function (error) {\n return error;\n });\n }).catch(function (error) {\n return done(error);\n });\n});\n\n/***/ }),\n/* 70 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar logger = __webpack_require__(2);\nvar passport = __webpack_require__(22);\n\nmodule.exports = function (app) {\n // route for sign up\n app.post('/signup', passport.authenticate('local-signup'), function (req, res) {\n logger.verbose('successful signup for ' + req.user.channelName);\n res.status(200).json({\n success: true,\n channelName: req.user.channelName,\n channelClaimId: req.user.channelClaimId,\n shortChannelId: req.user.shortChannelId\n });\n });\n // route for log in\n app.post('/login', function (req, res, next) {\n passport.authenticate('local-login', function (err, user, info) {\n logger.debug('info:', info);\n if (err) {\n return next(err);\n }\n if (!user) {\n return res.status(400).json({\n success: false,\n message: info.message\n });\n }\n logger.debug('successful login');\n req.logIn(user, function (err) {\n if (err) {\n return next(err);\n }\n return res.status(200).json({\n success: true,\n channelName: req.user.channelName,\n channelClaimId: req.user.channelClaimId,\n shortChannelId: req.user.shortChannelId\n });\n });\n })(req, res, next);\n });\n // route to log out\n app.get('/logout', function (req, res) {\n req.logout();\n res.status(200).json({ success: true, message: 'you successfully logged out' });\n });\n // see if user is authenticated, and return credentials if so\n app.get('/user', function (req, res) {\n if (req.user) {\n res.status(200).json({ success: true, data: req.user });\n } else {\n res.status(401).json({ success: false, message: 'user is not logged in' });\n }\n });\n};\n\n/***/ }),\n/* 71 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar logger = __webpack_require__(2);\nvar multipart = __webpack_require__(72);\n\nvar _require = __webpack_require__(3),\n files = _require.files,\n site = _require.site;\n\nvar multipartMiddleware = multipart({ uploadDir: files.uploadDirectory });\nvar db = __webpack_require__(6);\n\nvar _require2 = __webpack_require__(73),\n claimNameIsAvailable = _require2.claimNameIsAvailable,\n checkChannelAvailability = _require2.checkChannelAvailability,\n publish = _require2.publish;\n\nvar _require3 = __webpack_require__(16),\n getClaimList = _require3.getClaimList,\n resolveUri = _require3.resolveUri,\n getClaim = _require3.getClaim;\n\nvar _require4 = __webpack_require__(25),\n addGetResultsToFileData = _require4.addGetResultsToFileData,\n createBasicPublishParams = _require4.createBasicPublishParams,\n createThumbnailPublishParams = _require4.createThumbnailPublishParams,\n parsePublishApiRequestBody = _require4.parsePublishApiRequestBody,\n parsePublishApiRequestFiles = _require4.parsePublishApiRequestFiles,\n createFileData = _require4.createFileData;\n\nvar errorHandlers = __webpack_require__(26);\n\nvar _require5 = __webpack_require__(17),\n sendGATimingEvent = _require5.sendGATimingEvent;\n\nvar _require6 = __webpack_require__(75),\n authenticateUser = _require6.authenticateUser;\n\nvar _require7 = __webpack_require__(27),\n getChannelData = _require7.getChannelData,\n getChannelClaims = _require7.getChannelClaims,\n getClaimId = _require7.getClaimId;\n\nvar NO_CHANNEL = 'NO_CHANNEL';\nvar NO_CLAIM = 'NO_CLAIM';\n\nmodule.exports = function (app) {\n // route to check whether site has published to a channel\n app.get('/api/channel/availability/:name', function (_ref, res) {\n var ip = _ref.ip,\n originalUrl = _ref.originalUrl,\n params = _ref.params;\n\n checkChannelAvailability(params.name).then(function (result) {\n if (result === true) {\n res.status(200).json(true);\n } else {\n res.status(200).json(false);\n }\n }).catch(function (error) {\n errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n });\n });\n // route to get a short channel id from long channel Id\n app.get('/api/channel/short-id/:longId/:name', function (_ref2, res) {\n var ip = _ref2.ip,\n originalUrl = _ref2.originalUrl,\n params = _ref2.params;\n\n db.Certificate.getShortChannelIdFromLongChannelId(params.longId, params.name).then(function (shortId) {\n res.status(200).json(shortId);\n }).catch(function (error) {\n errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n });\n });\n app.get('/api/channel/data/:channelName/:channelClaimId', function (_ref3, res) {\n var ip = _ref3.ip,\n originalUrl = _ref3.originalUrl,\n body = _ref3.body,\n params = _ref3.params;\n\n var channelName = params.channelName;\n var channelClaimId = params.channelClaimId;\n if (channelClaimId === 'none') channelClaimId = null;\n getChannelData(channelName, channelClaimId, 0).then(function (data) {\n if (data === NO_CHANNEL) {\n return res.status(404).json({ success: false, message: 'No matching channel was found' });\n }\n res.status(200).json({ success: true, data: data });\n }).catch(function (error) {\n errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n });\n });\n app.get('/api/channel/claims/:channelName/:channelClaimId/:page', function (_ref4, res) {\n var ip = _ref4.ip,\n originalUrl = _ref4.originalUrl,\n body = _ref4.body,\n params = _ref4.params;\n\n var channelName = params.channelName;\n var channelClaimId = params.channelClaimId;\n if (channelClaimId === 'none') channelClaimId = null;\n var page = params.page;\n getChannelClaims(channelName, channelClaimId, page).then(function (data) {\n if (data === NO_CHANNEL) {\n return res.status(404).json({ success: false, message: 'No matching channel was found' });\n }\n res.status(200).json({ success: true, data: data });\n }).catch(function (error) {\n errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n });\n });\n // route to run a claim_list request on the daemon\n app.get('/api/claim/list/:name', function (_ref5, res) {\n var ip = _ref5.ip,\n originalUrl = _ref5.originalUrl,\n params = _ref5.params;\n\n getClaimList(params.name).then(function (claimsList) {\n res.status(200).json(claimsList);\n }).catch(function (error) {\n errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n });\n });\n // route to get an asset\n app.get('/api/claim/get/:name/:claimId', function (_ref6, res) {\n var ip = _ref6.ip,\n originalUrl = _ref6.originalUrl,\n params = _ref6.params;\n\n var name = params.name;\n var claimId = params.claimId;\n // resolve the claim\n db.Claim.resolveClaim(name, claimId).then(function (resolveResult) {\n // make sure a claim actually exists at that uri\n if (!resolveResult) {\n throw new Error('No matching uri found in Claim table');\n }\n var fileData = createFileData(resolveResult);\n // get the claim\n return Promise.all([fileData, getClaim(name + '#' + claimId)]);\n }).then(function (_ref7) {\n var _ref8 = _slicedToArray(_ref7, 2),\n fileData = _ref8[0],\n getResult = _ref8[1];\n\n fileData = addGetResultsToFileData(fileData, getResult);\n return Promise.all([db.upsert(db.File, fileData, { name: name, claimId: claimId }, 'File'), getResult]);\n }).then(function (_ref9) {\n var _ref10 = _slicedToArray(_ref9, 2),\n fileRecord = _ref10[0],\n _ref10$ = _ref10[1],\n message = _ref10$.message,\n completed = _ref10$.completed;\n\n res.status(200).json({ success: true, message: message, completed: completed });\n }).catch(function (error) {\n errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n });\n });\n // route to check whether this site published to a claim\n app.get('/api/claim/availability/:name', function (_ref11, res) {\n var ip = _ref11.ip,\n originalUrl = _ref11.originalUrl,\n params = _ref11.params;\n\n claimNameIsAvailable(params.name).then(function (result) {\n res.status(200).json(result);\n }).catch(function (error) {\n errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n });\n });\n // route to run a resolve request on the daemon\n app.get('/api/claim/resolve/:name/:claimId', function (_ref12, res) {\n var headers = _ref12.headers,\n ip = _ref12.ip,\n originalUrl = _ref12.originalUrl,\n params = _ref12.params;\n\n resolveUri(params.name + '#' + params.claimId).then(function (resolvedUri) {\n res.status(200).json(resolvedUri);\n }).catch(function (error) {\n errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n });\n });\n // route to run a publish request on the daemon\n app.post('/api/claim/publish', multipartMiddleware, function (_ref13, res) {\n var body = _ref13.body,\n files = _ref13.files,\n headers = _ref13.headers,\n ip = _ref13.ip,\n originalUrl = _ref13.originalUrl,\n user = _ref13.user;\n\n logger.debug('api/claim/publish req.body:', body);\n logger.debug('api/claim/publish req.files:', files);\n // define variables\n var channelName = void 0,\n channelId = void 0,\n channelPassword = void 0,\n description = void 0,\n fileName = void 0,\n filePath = void 0,\n fileType = void 0,\n gaStartTime = void 0,\n license = void 0,\n name = void 0,\n nsfw = void 0,\n thumbnail = void 0,\n thumbnailFileName = void 0,\n thumbnailFilePath = void 0,\n thumbnailFileType = void 0,\n title = void 0;\n // record the start time of the request\n gaStartTime = Date.now();\n // validate the body and files of the request\n try {\n var _parsePublishApiReque = parsePublishApiRequestBody(body);\n // validateApiPublishRequest(body, files);\n\n\n name = _parsePublishApiReque.name;\n nsfw = _parsePublishApiReque.nsfw;\n license = _parsePublishApiReque.license;\n title = _parsePublishApiReque.title;\n description = _parsePublishApiReque.description;\n thumbnail = _parsePublishApiReque.thumbnail;\n\n var _parsePublishApiReque2 = parsePublishApiRequestFiles(files);\n\n fileName = _parsePublishApiReque2.fileName;\n filePath = _parsePublishApiReque2.filePath;\n fileType = _parsePublishApiReque2.fileType;\n thumbnailFileName = _parsePublishApiReque2.thumbnailFileName;\n thumbnailFilePath = _parsePublishApiReque2.thumbnailFilePath;\n thumbnailFileType = _parsePublishApiReque2.thumbnailFileType;\n channelName = body.channelName;\n channelId = body.channelId;\n channelPassword = body.channelPassword;\n } catch (error) {\n return res.status(400).json({ success: false, message: error.message });\n }\n // check channel authorization\n Promise.all([authenticateUser(channelName, channelId, channelPassword, user), claimNameIsAvailable(name), createBasicPublishParams(filePath, name, title, description, license, nsfw, thumbnail), createThumbnailPublishParams(thumbnailFilePath, name, license, nsfw)]).then(function (_ref14) {\n var _ref15 = _slicedToArray(_ref14, 4),\n _ref15$ = _ref15[0],\n channelName = _ref15$.channelName,\n channelClaimId = _ref15$.channelClaimId,\n validatedClaimName = _ref15[1],\n publishParams = _ref15[2],\n thumbnailPublishParams = _ref15[3];\n\n // add channel details to the publish params\n if (channelName && channelClaimId) {\n publishParams['channel_name'] = channelName;\n publishParams['channel_id'] = channelClaimId;\n }\n // publish the thumbnail\n if (thumbnailPublishParams) {\n publish(thumbnailPublishParams, thumbnailFileName, thumbnailFileType);\n }\n // publish the asset\n return publish(publishParams, fileName, fileType);\n }).then(function (result) {\n res.status(200).json({\n success: true,\n message: 'publish completed successfully',\n data: {\n name: name,\n claimId: result.claim_id,\n url: site.host + '/' + result.claim_id + '/' + name,\n lbryTx: result\n }\n });\n // record the publish end time and send to google analytics\n sendGATimingEvent('end-to-end', 'publish', fileType, gaStartTime, Date.now());\n }).catch(function (error) {\n errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n });\n });\n // route to get a short claim id from long claim Id\n app.get('/api/claim/short-id/:longId/:name', function (_ref16, res) {\n var ip = _ref16.ip,\n originalUrl = _ref16.originalUrl,\n body = _ref16.body,\n params = _ref16.params;\n\n db.Claim.getShortClaimIdFromLongClaimId(params.longId, params.name).then(function (shortId) {\n res.status(200).json({ success: true, data: shortId });\n }).catch(function (error) {\n errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n });\n });\n app.post('/api/claim/long-id', function (_ref17, res) {\n var ip = _ref17.ip,\n originalUrl = _ref17.originalUrl,\n body = _ref17.body,\n params = _ref17.params;\n\n logger.debug('body:', body);\n var channelName = body.channelName;\n var channelClaimId = body.channelClaimId;\n var claimName = body.claimName;\n var claimId = body.claimId;\n getClaimId(channelName, channelClaimId, claimName, claimId).then(function (result) {\n if (result === NO_CHANNEL) {\n return res.status(404).json({ success: false, message: 'No matching channel could be found' });\n }\n if (result === NO_CLAIM) {\n return res.status(404).json({ success: false, message: 'No matching claim id could be found' });\n }\n res.status(200).json({ success: true, data: result });\n }).catch(function (error) {\n errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n });\n });\n app.get('/api/claim/data/:claimName/:claimId', function (_ref18, res) {\n var ip = _ref18.ip,\n originalUrl = _ref18.originalUrl,\n body = _ref18.body,\n params = _ref18.params;\n\n var claimName = params.claimName;\n var claimId = params.claimId;\n if (claimId === 'none') claimId = null;\n db.Claim.resolveClaim(claimName, claimId).then(function (claimInfo) {\n if (!claimInfo) {\n return res.status(404).json({ success: false, message: 'No claim could be found' });\n }\n res.status(200).json({ success: true, data: claimInfo });\n }).catch(function (error) {\n errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n });\n });\n // route to see if asset is available locally\n app.get('/api/file/availability/:name/:claimId', function (_ref19, res) {\n var ip = _ref19.ip,\n originalUrl = _ref19.originalUrl,\n params = _ref19.params;\n\n var name = params.name;\n var claimId = params.claimId;\n db.File.findOne({ where: { name: name, claimId: claimId } }).then(function (result) {\n if (result) {\n return res.status(200).json({ success: true, data: true });\n }\n res.status(200).json({ success: true, data: false });\n }).catch(function (error) {\n errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n });\n });\n};\n\n/***/ }),\n/* 72 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"connect-multiparty\");\n\n/***/ }),\n/* 73 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar logger = __webpack_require__(2);\nvar db = __webpack_require__(6);\nvar lbryApi = __webpack_require__(16);\nvar publishHelpers = __webpack_require__(25);\nvar config = __webpack_require__(3);\n\nmodule.exports = {\n publish: function publish(publishParams, fileName, fileType) {\n return new Promise(function (resolve, reject) {\n var publishResults = void 0,\n certificateId = void 0,\n channelName = void 0;\n // publish the file\n return lbryApi.publishClaim(publishParams).then(function (tx) {\n logger.info('Successfully published ' + publishParams.name + ' ' + fileName, tx);\n publishResults = tx;\n // get the channel information\n if (publishParams.channel_name) {\n logger.debug('this claim was published in channel: ' + publishParams.channel_name);\n return db.Channel.findOne({ where: { channelName: publishParams.channel_name } });\n } else {\n logger.debug('this claim was not published in a channel');\n return null;\n }\n }).then(function (channel) {\n // set channel information\n certificateId = null;\n channelName = null;\n if (channel) {\n certificateId = channel.channelClaimId;\n channelName = channel.channelName;\n }\n logger.debug('certificateId: ' + certificateId);\n }).then(function () {\n // create the File record\n var fileRecord = {\n name: publishParams.name,\n claimId: publishResults.claim_id,\n title: publishParams.metadata.title,\n description: publishParams.metadata.description,\n address: publishParams.claim_address,\n outpoint: publishResults.txid + ':' + publishResults.nout,\n height: 0,\n fileName: fileName,\n filePath: publishParams.file_path,\n fileType: fileType,\n nsfw: publishParams.metadata.nsfw\n };\n // create the Claim record\n var claimRecord = {\n name: publishParams.name,\n claimId: publishResults.claim_id,\n title: publishParams.metadata.title,\n description: publishParams.metadata.description,\n address: publishParams.claim_address,\n thumbnail: publishParams.metadata.thumbnail,\n outpoint: publishResults.txid + ':' + publishResults.nout,\n height: 0,\n contentType: fileType,\n nsfw: publishParams.metadata.nsfw,\n amount: publishParams.bid,\n certificateId: certificateId,\n channelName: channelName\n };\n // upsert criteria\n var upsertCriteria = {\n name: publishParams.name,\n claimId: publishResults.claim_id\n };\n // upsert the records\n return Promise.all([db.upsert(db.File, fileRecord, upsertCriteria, 'File'), db.upsert(db.Claim, claimRecord, upsertCriteria, 'Claim')]);\n }).then(function (_ref) {\n var _ref2 = _slicedToArray(_ref, 2),\n file = _ref2[0],\n claim = _ref2[1];\n\n logger.debug('File and Claim records successfully created');\n return Promise.all([file.setClaim(claim), claim.setFile(file)]);\n }).then(function () {\n logger.debug('File and Claim records successfully associated');\n resolve(publishResults); // resolve the promise with the result from lbryApi.publishClaim;\n }).catch(function (error) {\n logger.error('PUBLISH ERROR', error);\n publishHelpers.deleteTemporaryFile(publishParams.file_path); // delete the local file\n reject(error);\n });\n });\n },\n claimNameIsAvailable: function claimNameIsAvailable(name) {\n // find any records where the name is used\n return db.File.findAll({ where: { name: name } }).then(function (result) {\n if (result.length >= 1) {\n var claimAddress = config.wallet.lbryClaimAddress;\n // filter out any results that were not published from spee.ch's wallet address\n var filteredResult = result.filter(function (claim) {\n return claim.address === claimAddress;\n });\n // return based on whether any non-spee.ch claims were left\n if (filteredResult.length >= 1) {\n throw new Error('That claim is already in use');\n };\n return name;\n };\n return name;\n });\n },\n checkChannelAvailability: function checkChannelAvailability(name) {\n return new Promise(function (resolve, reject) {\n // find any records where the name is used\n db.Channel.findAll({ where: { channelName: name } }).then(function (result) {\n if (result.length >= 1) {\n return resolve(false);\n }\n resolve(true);\n }).catch(function (error) {\n reject(error);\n });\n });\n }\n};\n\n/***/ }),\n/* 74 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"fs\");\n\n/***/ }),\n/* 75 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar db = __webpack_require__(6);\nvar logger = __webpack_require__(2);\n\nmodule.exports = {\n authenticateUser: function authenticateUser(channelName, channelId, channelPassword, user) {\n // case: no channelName or channel Id are provided (anonymous), regardless of whether user token is provided\n if (!channelName && !channelId) {\n return {\n channelName: null,\n channelClaimId: null\n };\n }\n // case: channelName or channel Id are provided with user token\n if (user) {\n if (channelName && channelName !== user.channelName) {\n throw new Error('the provided channel name does not match user credentials');\n }\n if (channelId && channelId !== user.channelClaimId) {\n throw new Error('the provided channel id does not match user credentials');\n }\n return {\n channelName: user.channelName,\n channelClaimId: user.channelClaimId\n };\n }\n // case: channelName or channel Id are provided with password instead of user token\n if (!channelPassword) throw new Error('no channel password provided');\n return module.exports.authenticateChannelCredentials(channelName, channelId, channelPassword);\n },\n authenticateChannelCredentials: function authenticateChannelCredentials(channelName, channelId, userPassword) {\n return new Promise(function (resolve, reject) {\n // hoisted variables\n var channelData = void 0;\n // build the params for finding the channel\n var channelFindParams = {};\n if (channelName) channelFindParams['channelName'] = channelName;\n if (channelId) channelFindParams['channelClaimId'] = channelId;\n // find the channel\n db.Channel.findOne({\n where: channelFindParams\n }).then(function (channel) {\n if (!channel) {\n logger.debug('no channel found');\n throw new Error('Authentication failed, you do not have access to that channel');\n }\n channelData = channel.get();\n logger.debug('channel data:', channelData);\n return db.User.findOne({\n where: { userName: channelData.channelName.substring(1) }\n });\n }).then(function (user) {\n if (!user) {\n logger.debug('no user found');\n throw new Error('Authentication failed, you do not have access to that channel');\n }\n return user.comparePassword(userPassword);\n }).then(function (isMatch) {\n if (!isMatch) {\n logger.debug('incorrect password');\n throw new Error('Authentication failed, you do not have access to that channel');\n }\n logger.debug('...password was a match...');\n resolve(channelData);\n }).catch(function (error) {\n reject(error);\n });\n });\n }\n};\n\n/***/ }),\n/* 76 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar CLAIMS_PER_PAGE = 12;\n\nmodule.exports = {\n returnPaginatedChannelClaims: function returnPaginatedChannelClaims(channelName, longChannelClaimId, claims, page) {\n var totalPages = module.exports.determineTotalPages(claims);\n var paginationPage = module.exports.getPageFromQuery(page);\n var viewData = {\n channelName: channelName,\n longChannelClaimId: longChannelClaimId,\n claims: module.exports.extractPageFromClaims(claims, paginationPage),\n previousPage: module.exports.determinePreviousPage(paginationPage),\n currentPage: paginationPage,\n nextPage: module.exports.determineNextPage(totalPages, paginationPage),\n totalPages: totalPages,\n totalResults: module.exports.determineTotalClaims(claims)\n };\n return viewData;\n },\n getPageFromQuery: function getPageFromQuery(page) {\n if (page) {\n return parseInt(page);\n }\n return 1;\n },\n extractPageFromClaims: function extractPageFromClaims(claims, pageNumber) {\n if (!claims) {\n return []; // if no claims, return this default\n }\n // logger.debug('claims is array?', Array.isArray(claims));\n // logger.debug(`pageNumber ${pageNumber} is number?`, Number.isInteger(pageNumber));\n var claimStartIndex = (pageNumber - 1) * CLAIMS_PER_PAGE;\n var claimEndIndex = claimStartIndex + CLAIMS_PER_PAGE;\n var pageOfClaims = claims.slice(claimStartIndex, claimEndIndex);\n return pageOfClaims;\n },\n determineTotalPages: function determineTotalPages(claims) {\n if (!claims) {\n return 0;\n } else {\n var totalClaims = claims.length;\n if (totalClaims < CLAIMS_PER_PAGE) {\n return 1;\n }\n var fullPages = Math.floor(totalClaims / CLAIMS_PER_PAGE);\n var remainder = totalClaims % CLAIMS_PER_PAGE;\n if (remainder === 0) {\n return fullPages;\n }\n return fullPages + 1;\n }\n },\n determinePreviousPage: function determinePreviousPage(currentPage) {\n if (currentPage === 1) {\n return null;\n }\n return currentPage - 1;\n },\n determineNextPage: function determineNextPage(totalPages, currentPage) {\n if (currentPage === totalPages) {\n return null;\n }\n return currentPage + 1;\n },\n determineTotalClaims: function determineTotalClaims(claims) {\n if (!claims) {\n return 0;\n }\n return claims.length;\n }\n};\n\n/***/ }),\n/* 77 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _require = __webpack_require__(3),\n site = _require.site;\n\nvar handlePageRender = __webpack_require__(28);\n\nmodule.exports = function (app) {\n // route for the home page\n app.get('/', function (req, res) {\n handlePageRender(req, res);\n });\n // route to display login page\n app.get('/login', function (req, res) {\n handlePageRender(req, res);\n });\n // route to show 'about' page\n app.get('/about', function (req, res) {\n handlePageRender(req, res);\n });\n // route to display a list of the trending images\n app.get('/trending', function (req, res) {\n res.status(301).redirect('/popular');\n });\n app.get('/popular', function (req, res) {\n handlePageRender(req, res);\n });\n // route to display a list of the trending images\n app.get('/new', function (req, res) {\n handlePageRender(req, res);\n });\n // route to send embedable video player (for twitter)\n app.get('/embed/:claimId/:name', function (_ref, res) {\n var params = _ref.params;\n\n var claimId = params.claimId;\n var name = params.name;\n var host = site.host;\n // get and render the content\n res.status(200).render('embed', { layout: 'embed', host: host, claimId: claimId, name: name });\n });\n};\n\n/***/ }),\n/* 78 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function () {\n var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : initialState;\n var action = arguments[1];\n\n switch (action.type) {\n case actions.FILE_SELECTED:\n return Object.assign({}, initialState, { // note: clears to initial state\n file: action.data\n });\n case actions.FILE_CLEAR:\n return initialState;\n case actions.METADATA_UPDATE:\n return Object.assign({}, state, {\n metadata: Object.assign({}, state.metadata, _defineProperty({}, action.data.name, action.data.value))\n });\n case actions.CLAIM_UPDATE:\n return Object.assign({}, state, {\n claim: action.data\n });\n case actions.SET_PUBLISH_IN_CHANNEL:\n return Object.assign({}, state, {\n publishInChannel: action.channel\n });\n case actions.PUBLISH_STATUS_UPDATE:\n return Object.assign({}, state, {\n status: action.data\n });\n case actions.ERROR_UPDATE:\n return Object.assign({}, state, {\n error: Object.assign({}, state.error, _defineProperty({}, action.data.name, action.data.value))\n });\n case actions.SELECTED_CHANNEL_UPDATE:\n return Object.assign({}, state, {\n selectedChannel: action.data\n });\n case actions.TOGGLE_METADATA_INPUTS:\n return Object.assign({}, state, {\n showMetadataInputs: action.data\n });\n case actions.THUMBNAIL_NEW:\n return Object.assign({}, state, {\n thumbnail: action.data\n });\n default:\n return state;\n }\n};\n\nvar _publish_action_types = __webpack_require__(31);\n\nvar actions = _interopRequireWildcard(_publish_action_types);\n\nvar _publish_channel_select_states = __webpack_require__(32);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nvar _require = __webpack_require__(3),\n publish = _require.publish;\n\nvar initialState = {\n publishInChannel: false,\n selectedChannel: _publish_channel_select_states.LOGIN,\n showMetadataInputs: false,\n status: {\n status: null,\n message: null\n },\n error: {\n file: null,\n url: null,\n channel: null,\n publishSubmit: null\n },\n file: null,\n claim: '',\n metadata: {\n title: '',\n description: '',\n license: '',\n nsfw: false\n },\n thumbnailChannel: publish.thumbnailChannel,\n thumbnailChannelId: publish.thumbnailChannelId,\n thumbnail: null\n};\n\n/***/ }),\n/* 79 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function () {\n var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : initialState;\n var action = arguments[1];\n\n switch (action.type) {\n case actions.CHANNEL_UPDATE:\n return Object.assign({}, state, {\n loggedInChannel: action.data\n });\n default:\n return state;\n }\n};\n\nvar _channel_action_types = __webpack_require__(33);\n\nvar actions = _interopRequireWildcard(_channel_action_types);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nvar initialState = {\n loggedInChannel: {\n name: null,\n shortId: null,\n longId: null\n }\n};\n\n/***/ }),\n/* 80 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function () {\n var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : initialState;\n var action = arguments[1];\n\n switch (action.type) {\n // handle request\n case actions.REQUEST_ERROR:\n return Object.assign({}, state, {\n request: Object.assign({}, state.request, {\n error: action.data\n })\n });\n case actions.REQUEST_UPDATE:\n return Object.assign({}, state, {\n request: Object.assign({}, state.request, {\n type: action.data.requestType,\n id: action.data.requestId\n })\n });\n // store requests\n case actions.REQUEST_LIST_ADD:\n return Object.assign({}, state, {\n requestList: Object.assign({}, state.requestList, _defineProperty({}, action.data.id, {\n error: action.data.error,\n key: action.data.key\n }))\n });\n // asset data\n case actions.ASSET_ADD:\n return Object.assign({}, state, {\n assetList: Object.assign({}, state.assetList, _defineProperty({}, action.data.id, {\n error: action.data.error,\n name: action.data.name,\n claimId: action.data.claimId,\n shortId: action.data.shortId,\n claimData: action.data.claimData\n }))\n });\n // channel data\n case actions.CHANNEL_ADD:\n return Object.assign({}, state, {\n channelList: Object.assign({}, state.channelList, _defineProperty({}, action.data.id, {\n name: action.data.name,\n longId: action.data.longId,\n shortId: action.data.shortId,\n claimsData: action.data.claimsData\n }))\n });\n case actions.CHANNEL_CLAIMS_UPDATE_SUCCESS:\n return Object.assign({}, state, {\n channelList: Object.assign({}, state.channelList, _defineProperty({}, action.data.channelListId, Object.assign({}, state.channelList[action.data.channelListId], {\n claimsData: action.data.claimsData\n })))\n });\n // display an asset\n case actions.FILE_AVAILABILITY_UPDATE:\n return Object.assign({}, state, {\n displayAsset: Object.assign({}, state.displayAsset, {\n status: action.data\n })\n });\n case actions.DISPLAY_ASSET_ERROR:\n return Object.assign({}, state, {\n displayAsset: Object.assign({}, state.displayAsset, {\n error: action.data,\n status: _asset_display_states.ERROR\n })\n });\n default:\n return state;\n }\n};\n\nvar _show_action_types = __webpack_require__(12);\n\nvar actions = _interopRequireWildcard(_show_action_types);\n\nvar _asset_display_states = __webpack_require__(34);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nvar initialState = {\n request: {\n error: null,\n type: null,\n id: null\n },\n requestList: {},\n channelList: {},\n assetList: {},\n displayAsset: {\n error: null,\n status: _asset_display_states.LOCAL_CHECK\n }\n};\n\n/***/ }),\n/* 81 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function () {\n var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : initialState;\n var action = arguments[1];\n\n switch (action.type) {\n default:\n return state;\n }\n};\n\nvar _require = __webpack_require__(3),\n site = _require.site;\n\nvar initialState = {\n host: site.host\n};\n\n/***/ }),\n/* 82 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"react-ga\");\n\n/***/ }),\n/* 83 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _SEO = __webpack_require__(9);\n\nvar _SEO2 = _interopRequireDefault(_SEO);\n\nvar _NavBar = __webpack_require__(7);\n\nvar _NavBar2 = _interopRequireDefault(_NavBar);\n\nvar _PublishTool = __webpack_require__(91);\n\nvar _PublishTool2 = _interopRequireDefault(_PublishTool);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar HomePage = function (_React$Component) {\n _inherits(HomePage, _React$Component);\n\n function HomePage() {\n _classCallCheck(this, HomePage);\n\n return _possibleConstructorReturn(this, (HomePage.__proto__ || Object.getPrototypeOf(HomePage)).apply(this, arguments));\n }\n\n _createClass(HomePage, [{\n key: 'render',\n value: function render() {\n return _react2.default.createElement(\n 'div',\n { className: 'row row--tall flex-container--column' },\n _react2.default.createElement(_SEO2.default, null),\n _react2.default.createElement(_NavBar2.default, null),\n _react2.default.createElement(\n 'div',\n { className: 'row row--tall row--padded flex-container--column' },\n _react2.default.createElement(_PublishTool2.default, null)\n )\n );\n }\n }]);\n\n return HomePage;\n}(_react2.default.Component);\n\n;\n\nexports.default = HomePage;\n\n/***/ }),\n/* 84 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _require = __webpack_require__(3),\n siteTitle = _require.site.title;\n\nvar createPageTitle = exports.createPageTitle = function createPageTitle(pageTitle) {\n if (!pageTitle) {\n return '' + siteTitle;\n }\n return siteTitle + ' - ' + pageTitle;\n};\n\n/***/ }),\n/* 85 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _require = __webpack_require__(3),\n _require$site = _require.site,\n title = _require$site.title,\n host = _require$site.host,\n description = _require$site.description,\n _require$claim = _require.claim,\n defaultThumbnail = _require$claim.defaultThumbnail,\n defaultDescription = _require$claim.defaultDescription;\n\nvar determineOgThumbnailContentType = function determineOgThumbnailContentType(thumbnail) {\n if (thumbnail) {\n var fileExt = thumbnail.substring(thumbnail.lastIndexOf('.'));\n switch (fileExt) {\n case 'jpeg':\n case 'jpg':\n return 'image/jpeg';\n case 'png':\n return 'image/png';\n case 'gif':\n return 'image/gif';\n case 'mp4':\n return 'video/mp4';\n default:\n return 'image/jpeg';\n }\n }\n return '';\n};\n\nvar createBasicMetaTags = function createBasicMetaTags() {\n return [{ property: 'og:title', content: title }, { property: 'og:url', content: host }, { property: 'og:site_name', content: title }, { property: 'og:description', content: description }, { property: 'twitter:site', content: '@spee_ch' }, { property: 'twitter:card', content: 'summary' }];\n};\n\nvar createChannelMetaTags = function createChannelMetaTags(channel) {\n var name = channel.name,\n longId = channel.longId;\n\n return [{ property: 'og:title', content: name + ' on ' + title }, { property: 'og:url', content: host + '/' + name + ':' + longId }, { property: 'og:site_name', content: title }, { property: 'og:description', content: name + ', a channel on ' + title }, { property: 'twitter:site', content: '@spee_ch' }, { property: 'twitter:card', content: 'summary' }];\n};\n\nvar createAssetMetaTags = function createAssetMetaTags(asset) {\n var claimData = asset.claimData;\n var contentType = claimData.contentType;\n\n var embedUrl = host + '/' + claimData.claimId + '/' + claimData.name;\n var showUrl = host + '/' + claimData.claimId + '/' + claimData.name;\n var source = host + '/' + claimData.claimId + '/' + claimData.name + '.' + claimData.fileExt;\n var ogTitle = claimData.title || claimData.name;\n var ogDescription = claimData.description || defaultDescription;\n var ogThumbnailContentType = determineOgThumbnailContentType(claimData.thumbnail);\n var ogThumbnail = claimData.thumbnail || defaultThumbnail;\n var metaTags = [{ property: 'og:title', content: ogTitle }, { property: 'og:url', content: showUrl }, { property: 'og:site_name', content: title }, { property: 'og:description', content: ogDescription }, { property: 'og:image:width', content: 600 }, { property: 'og:image:height', content: 315 }, { property: 'twitter:site', content: '@spee_ch' }];\n if (contentType === 'video/mp4' || contentType === 'video/webm') {\n metaTags.push({ property: 'og:video', content: source });\n metaTags.push({ property: 'og:video:secure_url', content: source });\n metaTags.push({ property: 'og:video:type', content: contentType });\n metaTags.push({ property: 'og:image', content: ogThumbnail });\n metaTags.push({ property: 'og:image:type', content: ogThumbnailContentType });\n metaTags.push({ property: 'og:type', content: 'video' });\n metaTags.push({ property: 'twitter:card', content: 'player' });\n metaTags.push({ property: 'twitter:player', content: embedUrl });\n metaTags.push({ property: 'twitter:player:width', content: 600 });\n metaTags.push({ property: 'twitter:text:player_width', content: 600 });\n metaTags.push({ property: 'twitter:player:height', content: 337 });\n metaTags.push({ property: 'twitter:player:stream', content: source });\n metaTags.push({ property: 'twitter:player:stream:content_type', content: contentType });\n } else {\n metaTags.push({ property: 'og:image', content: source });\n metaTags.push({ property: 'og:image:type', content: contentType });\n metaTags.push({ property: 'og:type', content: 'article' });\n metaTags.push({ property: 'twitter:card', content: 'summary_large_image' });\n }\n return metaTags;\n};\n\nvar createMetaTags = exports.createMetaTags = function createMetaTags(asset, channel) {\n if (asset) {\n return createAssetMetaTags(asset);\n };\n if (channel) {\n return createChannelMetaTags(channel);\n };\n return createBasicMetaTags();\n};\n\n/***/ }),\n/* 86 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _require = __webpack_require__(3),\n host = _require.site.host;\n\nvar createBasicCanonicalLink = function createBasicCanonicalLink(page) {\n if (!page) {\n return '' + host;\n };\n return host + '/' + page;\n};\n\nvar createAssetCanonicalLink = function createAssetCanonicalLink(asset) {\n var channelName = void 0,\n certificateId = void 0,\n name = void 0,\n claimId = void 0;\n if (asset.claimData) {\n var _asset$claimData = asset.claimData;\n channelName = _asset$claimData.channelName;\n certificateId = _asset$claimData.certificateId;\n name = _asset$claimData.name;\n claimId = _asset$claimData.claimId;\n };\n if (channelName) {\n return host + '/' + channelName + ':' + certificateId + '/' + name;\n };\n return host + '/' + claimId + '/' + name;\n};\n\nvar createChannelCanonicalLink = function createChannelCanonicalLink(channel) {\n var name = channel.name,\n longId = channel.longId;\n\n return host + '/' + name + ':' + longId;\n};\n\nvar createCanonicalLink = exports.createCanonicalLink = function createCanonicalLink(asset, channel, page) {\n if (asset) {\n return createAssetCanonicalLink(asset);\n }\n if (channel) {\n return createChannelCanonicalLink(channel);\n }\n if (page) {\n return createBasicCanonicalLink(page);\n }\n return createBasicCanonicalLink();\n};\n\n/***/ }),\n/* 87 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _reactRouterDom = __webpack_require__(4);\n\nvar _Logo = __webpack_require__(88);\n\nvar _Logo2 = _interopRequireDefault(_Logo);\n\nvar _NavBarChannelOptionsDropdown = __webpack_require__(89);\n\nvar _NavBarChannelOptionsDropdown2 = _interopRequireDefault(_NavBarChannelOptionsDropdown);\n\nvar _request = __webpack_require__(11);\n\nvar _request2 = _interopRequireDefault(_request);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar VIEW = 'VIEW';\nvar LOGOUT = 'LOGOUT';\n\nvar NavBar = function (_React$Component) {\n _inherits(NavBar, _React$Component);\n\n function NavBar(props) {\n _classCallCheck(this, NavBar);\n\n var _this = _possibleConstructorReturn(this, (NavBar.__proto__ || Object.getPrototypeOf(NavBar)).call(this, props));\n\n _this.checkForLoggedInUser = _this.checkForLoggedInUser.bind(_this);\n _this.logoutUser = _this.logoutUser.bind(_this);\n _this.handleSelection = _this.handleSelection.bind(_this);\n return _this;\n }\n\n _createClass(NavBar, [{\n key: 'componentDidMount',\n value: function componentDidMount() {\n // check to see if the user is already logged in\n this.checkForLoggedInUser();\n }\n }, {\n key: 'checkForLoggedInUser',\n value: function checkForLoggedInUser() {\n var _this2 = this;\n\n var params = { credentials: 'include' };\n (0, _request2.default)('/user', params).then(function (_ref) {\n var data = _ref.data;\n\n _this2.props.onChannelLogin(data.channelName, data.shortChannelId, data.channelClaimId);\n }).catch(function (error) {\n console.log('/user error:', error.message);\n });\n }\n }, {\n key: 'logoutUser',\n value: function logoutUser() {\n var _this3 = this;\n\n var params = { credentials: 'include' };\n (0, _request2.default)('/logout', params).then(function () {\n _this3.props.onChannelLogout();\n }).catch(function (error) {\n console.log('/logout error', error.message);\n });\n }\n }, {\n key: 'handleSelection',\n value: function handleSelection(event) {\n var value = event.target.selectedOptions[0].value;\n switch (value) {\n case LOGOUT:\n this.logoutUser();\n break;\n case VIEW:\n // redirect to channel page\n this.props.history.push('/' + this.props.channelName + ':' + this.props.channelLongId);\n break;\n default:\n break;\n }\n }\n }, {\n key: 'render',\n value: function render() {\n return _react2.default.createElement(\n 'div',\n { className: 'row row--wide nav-bar' },\n _react2.default.createElement(\n 'div',\n { className: 'row row--padded row--short flex-container--row flex-container--space-between-center' },\n _react2.default.createElement(_Logo2.default, null),\n _react2.default.createElement(\n 'div',\n { className: 'nav-bar--center' },\n _react2.default.createElement(\n 'span',\n { className: 'nav-bar-tagline' },\n 'Open-source, decentralized image and video sharing.'\n )\n ),\n _react2.default.createElement(\n 'div',\n { className: 'nav-bar--right' },\n _react2.default.createElement(\n _reactRouterDom.NavLink,\n { className: 'nav-bar-link link--nav', activeClassName: 'link--nav-active', to: '/', exact: true },\n 'Publish'\n ),\n _react2.default.createElement(\n _reactRouterDom.NavLink,\n { className: 'nav-bar-link link--nav', activeClassName: 'link--nav-active', to: '/about' },\n 'About'\n ),\n this.props.channelName ? _react2.default.createElement(_NavBarChannelOptionsDropdown2.default, {\n channelName: this.props.channelName,\n handleSelection: this.handleSelection,\n defaultSelection: this.props.channelName,\n VIEW: VIEW,\n LOGOUT: LOGOUT\n }) : _react2.default.createElement(\n _reactRouterDom.NavLink,\n { id: 'nav-bar-login-link', className: 'nav-bar-link link--nav', activeClassName: 'link--nav-active', to: '/login' },\n 'Channel'\n )\n )\n )\n );\n }\n }]);\n\n return NavBar;\n}(_react2.default.Component);\n\nexports.default = (0, _reactRouterDom.withRouter)(NavBar);\n\n/***/ }),\n/* 88 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _reactRouterDom = __webpack_require__(4);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction Logo() {\n return _react2.default.createElement(\n 'svg',\n { version: '1.1', id: 'Layer_1', x: '0px', y: '0px', height: '24px', viewBox: '0 0 80 31', enableBackground: 'new 0 0 80 31', className: 'nav-bar-logo' },\n _react2.default.createElement(\n _reactRouterDom.Link,\n { to: '/' },\n _react2.default.createElement(\n 'title',\n null,\n 'Logo'\n ),\n _react2.default.createElement(\n 'desc',\n null,\n 'Spee.ch logo'\n ),\n _react2.default.createElement(\n 'g',\n { id: 'About' },\n _react2.default.createElement(\n 'g',\n { id: 'Publish-Form-V2-_x28_filled_x29_', transform: 'translate(-42.000000, -23.000000)' },\n _react2.default.createElement(\n 'g',\n { id: 'Group-17', transform: 'translate(42.000000, 22.000000)' },\n _react2.default.createElement(\n 'text',\n { transform: 'matrix(1 0 0 1 0 20)', fontSize: '25', fontFamily: 'Roboto' },\n 'Spee 10000000) {\n throw new Error('Sorry, images are limited to 10 megabytes.');\n }\n break;\n case 'image/gif':\n if (file.size > 50000000) {\n throw new Error('Sorry, GIFs are limited to 50 megabytes.');\n }\n break;\n case 'video/mp4':\n if (file.size > 50000000) {\n throw new Error('Sorry, videos are limited to 50 megabytes.');\n }\n break;\n default:\n throw new Error(file.type + ' is not a supported file type. Only, .jpeg, .png, .gif, and .mp4 files are currently supported.');\n }\n }\n};\n\n/***/ }),\n/* 95 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(10);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar Preview = function (_React$Component) {\n _inherits(Preview, _React$Component);\n\n function Preview(props) {\n _classCallCheck(this, Preview);\n\n var _this = _possibleConstructorReturn(this, (Preview.__proto__ || Object.getPrototypeOf(Preview)).call(this, props));\n\n _this.state = {\n imgSource: '',\n defaultThumbnail: '/assets/img/video_thumb_default.png'\n };\n return _this;\n }\n\n _createClass(Preview, [{\n key: 'componentDidMount',\n value: function componentDidMount() {\n this.setPreviewImageSource(this.props.file);\n }\n }, {\n key: 'componentWillReceiveProps',\n value: function componentWillReceiveProps(newProps) {\n if (newProps.file !== this.props.file) {\n this.setPreviewImageSource(newProps.file);\n }\n if (newProps.thumbnail !== this.props.thumbnail) {\n if (newProps.thumbnail) {\n this.setPreviewImageSourceFromFile(newProps.thumbnail);\n } else {\n this.setState({ imgSource: this.state.defaultThumbnail });\n }\n }\n }\n }, {\n key: 'setPreviewImageSourceFromFile',\n value: function setPreviewImageSourceFromFile(file) {\n var _this2 = this;\n\n var previewReader = new FileReader();\n previewReader.readAsDataURL(file);\n previewReader.onloadend = function () {\n _this2.setState({ imgSource: previewReader.result });\n };\n }\n }, {\n key: 'setPreviewImageSource',\n value: function setPreviewImageSource(file) {\n if (file.type !== 'video/mp4') {\n this.setPreviewImageSourceFromFile(file);\n } else {\n if (this.props.thumbnail) {\n this.setPreviewImageSourceFromFile(this.props.thumbnail);\n }\n this.setState({ imgSource: this.state.defaultThumbnail });\n }\n }\n }, {\n key: 'render',\n value: function render() {\n return _react2.default.createElement('img', {\n id: 'dropzone-preview',\n src: this.state.imgSource,\n className: this.props.dimPreview ? 'dim' : '',\n alt: 'publish preview'\n });\n }\n }]);\n\n return Preview;\n}(_react2.default.Component);\n\n;\n\nPreview.propTypes = {\n dimPreview: _propTypes2.default.bool.isRequired,\n file: _propTypes2.default.object.isRequired,\n thumbnail: _propTypes2.default.object\n};\n\nexports.default = Preview;\n\n/***/ }),\n/* 96 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _reactRedux = __webpack_require__(1);\n\nvar _publish = __webpack_require__(5);\n\nvar _view = __webpack_require__(97);\n\nvar _view2 = _interopRequireDefault(_view);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar mapStateToProps = function mapStateToProps(_ref) {\n var channel = _ref.channel,\n publish = _ref.publish;\n\n return {\n file: publish.file\n };\n};\n\nvar mapDispatchToProps = {\n clearFile: _publish.clearFile,\n startPublish: _publish.startPublish\n};\n\nexports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(_view2.default);\n\n/***/ }),\n/* 97 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _reactRouterDom = __webpack_require__(4);\n\nvar _Dropzone = __webpack_require__(37);\n\nvar _Dropzone2 = _interopRequireDefault(_Dropzone);\n\nvar _PublishTitleInput = __webpack_require__(98);\n\nvar _PublishTitleInput2 = _interopRequireDefault(_PublishTitleInput);\n\nvar _PublishUrlInput = __webpack_require__(100);\n\nvar _PublishUrlInput2 = _interopRequireDefault(_PublishUrlInput);\n\nvar _PublishThumbnailInput = __webpack_require__(103);\n\nvar _PublishThumbnailInput2 = _interopRequireDefault(_PublishThumbnailInput);\n\nvar _PublishMetadataInputs = __webpack_require__(105);\n\nvar _PublishMetadataInputs2 = _interopRequireDefault(_PublishMetadataInputs);\n\nvar _ChannelSelect = __webpack_require__(108);\n\nvar _ChannelSelect2 = _interopRequireDefault(_ChannelSelect);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar PublishDetails = function (_React$Component) {\n _inherits(PublishDetails, _React$Component);\n\n function PublishDetails(props) {\n _classCallCheck(this, PublishDetails);\n\n var _this = _possibleConstructorReturn(this, (PublishDetails.__proto__ || Object.getPrototypeOf(PublishDetails)).call(this, props));\n\n _this.onPublishSubmit = _this.onPublishSubmit.bind(_this);\n return _this;\n }\n\n _createClass(PublishDetails, [{\n key: 'onPublishSubmit',\n value: function onPublishSubmit() {\n this.props.startPublish(this.props.history);\n }\n }, {\n key: 'render',\n value: function render() {\n return _react2.default.createElement(\n 'div',\n { className: 'row row--no-bottom' },\n _react2.default.createElement(\n 'div',\n { className: 'column column--10' },\n _react2.default.createElement(_PublishTitleInput2.default, null)\n ),\n _react2.default.createElement(\n 'div',\n { className: 'column column--5 column--sml-10' },\n _react2.default.createElement(\n 'div',\n { className: 'row row--padded' },\n _react2.default.createElement(_Dropzone2.default, null)\n )\n ),\n _react2.default.createElement(\n 'div',\n { className: 'column column--5 column--sml-10 align-content-top' },\n _react2.default.createElement(\n 'div',\n { id: 'publish-active-area', className: 'row row--padded' },\n _react2.default.createElement(\n 'div',\n { className: 'row row--padded row--no-top row--wide' },\n _react2.default.createElement(_PublishUrlInput2.default, null)\n ),\n _react2.default.createElement(\n 'div',\n { className: 'row row--padded row--no-top row--wide' },\n _react2.default.createElement(_ChannelSelect2.default, null)\n ),\n this.props.file.type === 'video/mp4' && _react2.default.createElement(\n 'div',\n { className: 'row row--padded row--no-top row--wide ' },\n _react2.default.createElement(_PublishThumbnailInput2.default, null)\n ),\n _react2.default.createElement(\n 'div',\n { className: 'row row--padded row--no-top row--no-bottom row--wide' },\n _react2.default.createElement(_PublishMetadataInputs2.default, null)\n ),\n _react2.default.createElement(\n 'div',\n { className: 'row row--wide align-content-center' },\n _react2.default.createElement(\n 'button',\n { id: 'publish-submit', className: 'button--primary button--large', onClick: this.onPublishSubmit },\n 'Publish'\n )\n ),\n _react2.default.createElement(\n 'div',\n { className: 'row row--padded row--no-bottom align-content-center' },\n _react2.default.createElement(\n 'button',\n { className: 'button--cancel', onClick: this.props.clearFile },\n 'Cancel'\n )\n ),\n _react2.default.createElement(\n 'div',\n { className: 'row row--short align-content-center' },\n _react2.default.createElement(\n 'p',\n { className: 'fine-print' },\n 'By clicking \\'Publish\\', you affirm that you have the rights to publish this content to the LBRY network, and that you understand the properties of publishing it to a decentralized, user-controlled network. ',\n _react2.default.createElement(\n 'a',\n { className: 'link--primary', target: '_blank', href: 'https://lbry.io/learn' },\n 'Read more.'\n )\n )\n )\n )\n )\n );\n }\n }]);\n\n return PublishDetails;\n}(_react2.default.Component);\n\n;\n\nexports.default = (0, _reactRouterDom.withRouter)(PublishDetails);\n\n/***/ }),\n/* 98 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _reactRedux = __webpack_require__(1);\n\nvar _publish = __webpack_require__(5);\n\nvar _view = __webpack_require__(99);\n\nvar _view2 = _interopRequireDefault(_view);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar mapStateToProps = function mapStateToProps(_ref) {\n var publish = _ref.publish;\n\n return {\n title: publish.metadata.title\n };\n};\n\nvar mapDispatchToProps = function mapDispatchToProps(dispatch) {\n return {\n onMetadataChange: function onMetadataChange(name, value) {\n dispatch((0, _publish.updateMetadata)(name, value));\n }\n };\n};\n\nexports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(_view2.default);\n\n/***/ }),\n/* 99 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar PublishTitleInput = function (_React$Component) {\n _inherits(PublishTitleInput, _React$Component);\n\n function PublishTitleInput(props) {\n _classCallCheck(this, PublishTitleInput);\n\n var _this = _possibleConstructorReturn(this, (PublishTitleInput.__proto__ || Object.getPrototypeOf(PublishTitleInput)).call(this, props));\n\n _this.handleInput = _this.handleInput.bind(_this);\n return _this;\n }\n\n _createClass(PublishTitleInput, [{\n key: 'handleInput',\n value: function handleInput(e) {\n var name = e.target.name;\n var value = e.target.value;\n this.props.onMetadataChange(name, value);\n }\n }, {\n key: 'render',\n value: function render() {\n return _react2.default.createElement('input', { type: 'text', id: 'publish-title', className: 'input-text text--large input-text--full-width', name: 'title', placeholder: 'Give your post a title...', onChange: this.handleInput, value: this.props.title });\n }\n }]);\n\n return PublishTitleInput;\n}(_react2.default.Component);\n\nexports.default = PublishTitleInput;\n\n/***/ }),\n/* 100 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _publish = __webpack_require__(5);\n\nvar _reactRedux = __webpack_require__(1);\n\nvar _view = __webpack_require__(101);\n\nvar _view2 = _interopRequireDefault(_view);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar mapStateToProps = function mapStateToProps(_ref) {\n var channel = _ref.channel,\n publish = _ref.publish;\n\n return {\n loggedInChannelName: channel.loggedInChannel.name,\n loggedInChannelShortId: channel.loggedInChannel.shortId,\n fileName: publish.file.name,\n publishInChannel: publish.publishInChannel,\n selectedChannel: publish.selectedChannel,\n claim: publish.claim,\n urlError: publish.error.url\n };\n};\n\nvar mapDispatchToProps = function mapDispatchToProps(dispatch) {\n return {\n onClaimChange: function onClaimChange(value) {\n dispatch((0, _publish.updateClaim)(value));\n dispatch((0, _publish.updateError)('publishSubmit', null));\n },\n onUrlError: function onUrlError(value) {\n dispatch((0, _publish.updateError)('url', value));\n }\n };\n};\n\nexports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(_view2.default);\n\n/***/ }),\n/* 101 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _request = __webpack_require__(11);\n\nvar _request2 = _interopRequireDefault(_request);\n\nvar _PublishUrlMiddleDisplay = __webpack_require__(102);\n\nvar _PublishUrlMiddleDisplay2 = _interopRequireDefault(_PublishUrlMiddleDisplay);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar PublishUrlInput = function (_React$Component) {\n _inherits(PublishUrlInput, _React$Component);\n\n function PublishUrlInput(props) {\n _classCallCheck(this, PublishUrlInput);\n\n var _this = _possibleConstructorReturn(this, (PublishUrlInput.__proto__ || Object.getPrototypeOf(PublishUrlInput)).call(this, props));\n\n _this.handleInput = _this.handleInput.bind(_this);\n return _this;\n }\n\n _createClass(PublishUrlInput, [{\n key: 'componentDidMount',\n value: function componentDidMount() {\n var _props = this.props,\n claim = _props.claim,\n fileName = _props.fileName;\n\n if (!claim) {\n this.setClaimName(fileName);\n }\n }\n }, {\n key: 'componentWillReceiveProps',\n value: function componentWillReceiveProps(_ref) {\n var claim = _ref.claim,\n fileName = _ref.fileName;\n\n // if a new file was chosen, update the claim name\n if (fileName !== this.props.fileName) {\n return this.setClaimName(fileName);\n }\n // if the claim has updated, check its availability\n if (claim !== this.props.claim) {\n this.validateClaim(claim);\n }\n }\n }, {\n key: 'handleInput',\n value: function handleInput(event) {\n var value = event.target.value;\n value = this.cleanseInput(value);\n // update the state\n this.props.onClaimChange(value);\n }\n }, {\n key: 'cleanseInput',\n value: function cleanseInput(input) {\n input = input.replace(/\\s+/g, '-'); // replace spaces with dashes\n input = input.replace(/[^A-Za-z0-9-]/g, ''); // remove all characters that are not A-Z, a-z, 0-9, or '-'\n return input;\n }\n }, {\n key: 'setClaimName',\n value: function setClaimName(fileName) {\n var fileNameWithoutEnding = fileName.substring(0, fileName.lastIndexOf('.'));\n var cleanClaimName = this.cleanseInput(fileNameWithoutEnding);\n this.props.onClaimChange(cleanClaimName);\n }\n }, {\n key: 'validateClaim',\n value: function validateClaim(claim) {\n var _this2 = this;\n\n if (!claim) {\n return this.props.onUrlError('Enter a url above');\n }\n (0, _request2.default)('/api/claim/availability/' + claim).then(function () {\n _this2.props.onUrlError(null);\n }).catch(function (error) {\n _this2.props.onUrlError(error.message);\n });\n }\n }, {\n key: 'render',\n value: function render() {\n var _props2 = this.props,\n claim = _props2.claim,\n loggedInChannelName = _props2.loggedInChannelName,\n loggedInChannelShortId = _props2.loggedInChannelShortId,\n publishInChannel = _props2.publishInChannel,\n selectedChannel = _props2.selectedChannel,\n urlError = _props2.urlError;\n\n return _react2.default.createElement(\n 'div',\n { className: 'column column--10 column--sml-10' },\n _react2.default.createElement(\n 'div',\n { className: 'input-text--primary span--relative' },\n _react2.default.createElement(\n 'span',\n { className: 'url-text--secondary' },\n 'spee.ch / '\n ),\n _react2.default.createElement(_PublishUrlMiddleDisplay2.default, {\n publishInChannel: publishInChannel,\n selectedChannel: selectedChannel,\n loggedInChannelName: loggedInChannelName,\n loggedInChannelShortId: loggedInChannelShortId\n }),\n _react2.default.createElement('input', { type: 'text', id: 'claim-name-input', className: 'input-text', name: 'claim', placeholder: 'your-url-here', onChange: this.handleInput, value: claim }),\n claim && !urlError && _react2.default.createElement(\n 'span',\n { id: 'input-success-claim-name', className: 'info-message--success span--absolute' },\n '\\u2713'\n ),\n urlError && _react2.default.createElement(\n 'span',\n { id: 'input-success-channel-name', className: 'info-message--failure span--absolute' },\n '\\u2716'\n )\n ),\n _react2.default.createElement(\n 'div',\n null,\n urlError ? _react2.default.createElement(\n 'p',\n { id: 'input-error-claim-name', className: 'info-message--failure' },\n urlError\n ) : _react2.default.createElement(\n 'p',\n { className: 'info-message' },\n 'Choose a custom url'\n )\n )\n );\n }\n }]);\n\n return PublishUrlInput;\n}(_react2.default.Component);\n\nexports.default = PublishUrlInput;\n\n/***/ }),\n/* 102 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(10);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction UrlMiddle(_ref) {\n var publishInChannel = _ref.publishInChannel,\n selectedChannel = _ref.selectedChannel,\n loggedInChannelName = _ref.loggedInChannelName,\n loggedInChannelShortId = _ref.loggedInChannelShortId;\n\n if (publishInChannel) {\n if (selectedChannel === loggedInChannelName) {\n return _react2.default.createElement(\n 'span',\n { id: 'url-channel', className: 'url-text--secondary' },\n loggedInChannelName,\n ':',\n loggedInChannelShortId,\n ' /'\n );\n }\n return _react2.default.createElement(\n 'span',\n { id: 'url-channel-placeholder', className: 'url-text--secondary tooltip' },\n '@channel',\n _react2.default.createElement(\n 'span',\n {\n className: 'tooltip-text' },\n 'Select a channel below'\n ),\n ' /'\n );\n }\n return _react2.default.createElement(\n 'span',\n { id: 'url-no-channel-placeholder', className: 'url-text--secondary tooltip' },\n 'xyz',\n _react2.default.createElement(\n 'span',\n { className: 'tooltip-text' },\n 'This will be a random id'\n ),\n ' /'\n );\n}\n\nUrlMiddle.propTypes = {\n publishInChannel: _propTypes2.default.bool.isRequired,\n loggedInChannelName: _propTypes2.default.string,\n loggedInChannelShortId: _propTypes2.default.string\n};\n\nexports.default = UrlMiddle;\n\n/***/ }),\n/* 103 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _reactRedux = __webpack_require__(1);\n\nvar _publish = __webpack_require__(5);\n\nvar _view = __webpack_require__(104);\n\nvar _view2 = _interopRequireDefault(_view);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar mapStateToProps = function mapStateToProps(_ref) {\n var file = _ref.publish.file;\n\n return {\n file: file\n };\n};\n\nvar mapDispatchToProps = {\n onNewThumbnail: _publish.onNewThumbnail\n};\n\nexports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(_view2.default);\n\n/***/ }),\n/* 104 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nfunction dataURItoBlob(dataURI) {\n // convert base64/URLEncoded data component to raw binary data held in a string\n var byteString = atob(dataURI.split(',')[1]);\n // separate out the mime component\n var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0];\n // write the bytes of the string to a typed array\n var ia = new Uint8Array(byteString.length);\n for (var i = 0; i < byteString.length; i++) {\n ia[i] = byteString.charCodeAt(i);\n }\n return new Blob([ia], { type: mimeString });\n}\n\nvar PublishThumbnailInput = function (_React$Component) {\n _inherits(PublishThumbnailInput, _React$Component);\n\n function PublishThumbnailInput(props) {\n _classCallCheck(this, PublishThumbnailInput);\n\n var _this = _possibleConstructorReturn(this, (PublishThumbnailInput.__proto__ || Object.getPrototypeOf(PublishThumbnailInput)).call(this, props));\n\n _this.state = {\n videoSource: null,\n error: null,\n sliderMinRange: 1,\n sliderMaxRange: null,\n sliderValue: null\n };\n _this.handleVideoLoadedData = _this.handleVideoLoadedData.bind(_this);\n _this.handleSliderChange = _this.handleSliderChange.bind(_this);\n _this.createThumbnail = _this.createThumbnail.bind(_this);\n return _this;\n }\n\n _createClass(PublishThumbnailInput, [{\n key: 'componentDidMount',\n value: function componentDidMount() {\n var file = this.props.file;\n\n this.setVideoSource(file);\n }\n }, {\n key: 'componentWillReceiveProps',\n value: function componentWillReceiveProps(nextProps) {\n // if file changes\n if (nextProps.file && nextProps.file !== this.props.file) {\n var file = nextProps.file;\n\n this.setVideoSource(file);\n };\n }\n }, {\n key: 'setVideoSource',\n value: function setVideoSource(file) {\n var _this2 = this;\n\n var previewReader = new FileReader();\n previewReader.readAsDataURL(file);\n previewReader.onloadend = function () {\n var dataUri = previewReader.result;\n var blob = dataURItoBlob(dataUri);\n var videoSource = URL.createObjectURL(blob);\n _this2.setState({ videoSource: videoSource });\n };\n }\n }, {\n key: 'handleVideoLoadedData',\n value: function handleVideoLoadedData(event) {\n var duration = event.target.duration;\n var totalMinutes = Math.floor(duration / 60);\n var totalSeconds = Math.floor(duration % 60);\n // set the slider\n this.setState({\n sliderMaxRange: duration * 100,\n sliderValue: duration * 100 / 2,\n totalMinutes: totalMinutes,\n totalSeconds: totalSeconds\n });\n // update the current time of the video\n var video = document.getElementById('video-thumb-player');\n video.currentTime = duration / 2;\n }\n }, {\n key: 'handleSliderChange',\n value: function handleSliderChange(event) {\n var value = parseInt(event.target.value);\n // update the slider value\n this.setState({\n sliderValue: value\n });\n // update the current time of the video\n var video = document.getElementById('video-thumb-player');\n video.currentTime = value / 100;\n }\n }, {\n key: 'createThumbnail',\n value: function createThumbnail() {\n // take a snapshot\n var video = document.getElementById('video-thumb-player');\n var canvas = document.createElement('canvas');\n canvas.width = video.videoWidth;\n canvas.height = video.videoHeight;\n canvas.getContext('2d').drawImage(video, 0, 0, canvas.width, canvas.height);\n var dataUrl = canvas.toDataURL();\n var blob = dataURItoBlob(dataUrl);\n var snapshot = new File([blob], 'thumbnail.png', {\n type: 'image/png'\n });\n // set the thumbnail in redux store\n if (snapshot) {\n this.props.onNewThumbnail(snapshot);\n }\n }\n }, {\n key: 'render',\n value: function render() {\n var _state = this.state,\n error = _state.error,\n videoSource = _state.videoSource,\n sliderMinRange = _state.sliderMinRange,\n sliderMaxRange = _state.sliderMaxRange,\n sliderValue = _state.sliderValue,\n totalMinutes = _state.totalMinutes,\n totalSeconds = _state.totalSeconds;\n\n return _react2.default.createElement(\n 'div',\n null,\n _react2.default.createElement(\n 'label',\n { className: 'label' },\n 'Thumbnail:'\n ),\n _react2.default.createElement('video', {\n id: 'video-thumb-player',\n preload: 'metadata',\n muted: true,\n style: { display: 'none' },\n playsInline: true,\n onLoadedData: this.handleVideoLoadedData,\n src: videoSource,\n onSeeked: this.createThumbnail\n }),\n sliderValue ? _react2.default.createElement(\n 'div',\n null,\n _react2.default.createElement(\n 'div',\n { className: 'flex-container--row flex-container--space-between-center', style: { width: '100%' } },\n _react2.default.createElement(\n 'span',\n { className: 'info-message' },\n '0\\'00\"'\n ),\n _react2.default.createElement(\n 'span',\n { className: 'info-message' },\n totalMinutes,\n '\\'',\n totalSeconds,\n '\"'\n )\n ),\n _react2.default.createElement(\n 'div',\n null,\n _react2.default.createElement('input', {\n type: 'range',\n min: sliderMinRange,\n max: sliderMaxRange,\n value: sliderValue,\n className: 'slider',\n onChange: this.handleSliderChange\n })\n )\n ) : _react2.default.createElement(\n 'p',\n { className: 'info-message' },\n 'loading... '\n ),\n error ? _react2.default.createElement(\n 'p',\n { className: 'info-message--failure' },\n error\n ) : _react2.default.createElement(\n 'p',\n { className: 'info-message' },\n 'Use slider to set thumbnail'\n )\n );\n }\n }]);\n\n return PublishThumbnailInput;\n}(_react2.default.Component);\n\nexports.default = PublishThumbnailInput;\n\n/***/ }),\n/* 105 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _reactRedux = __webpack_require__(1);\n\nvar _publish = __webpack_require__(5);\n\nvar _view = __webpack_require__(106);\n\nvar _view2 = _interopRequireDefault(_view);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar mapStateToProps = function mapStateToProps(_ref) {\n var publish = _ref.publish;\n\n return {\n showMetadataInputs: publish.showMetadataInputs,\n description: publish.metadata.description,\n license: publish.metadata.license,\n nsfw: publish.metadata.nsfw\n };\n};\n\nvar mapDispatchToProps = function mapDispatchToProps(dispatch) {\n return {\n onMetadataChange: function onMetadataChange(name, value) {\n dispatch((0, _publish.updateMetadata)(name, value));\n },\n onToggleMetadataInputs: function onToggleMetadataInputs(value) {\n dispatch((0, _publish.toggleMetadataInputs)(value));\n }\n };\n};\n\nexports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(_view2.default);\n\n/***/ }),\n/* 106 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _ExpandingTextArea = __webpack_require__(107);\n\nvar _ExpandingTextArea2 = _interopRequireDefault(_ExpandingTextArea);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar PublishMetadataInputs = function (_React$Component) {\n _inherits(PublishMetadataInputs, _React$Component);\n\n function PublishMetadataInputs(props) {\n _classCallCheck(this, PublishMetadataInputs);\n\n var _this = _possibleConstructorReturn(this, (PublishMetadataInputs.__proto__ || Object.getPrototypeOf(PublishMetadataInputs)).call(this, props));\n\n _this.toggleShowInputs = _this.toggleShowInputs.bind(_this);\n _this.handleInput = _this.handleInput.bind(_this);\n _this.handleSelect = _this.handleSelect.bind(_this);\n return _this;\n }\n\n _createClass(PublishMetadataInputs, [{\n key: 'toggleShowInputs',\n value: function toggleShowInputs() {\n this.props.onToggleMetadataInputs(!this.props.showMetadataInputs);\n }\n }, {\n key: 'handleInput',\n value: function handleInput(event) {\n var target = event.target;\n var value = target.type === 'checkbox' ? target.checked : target.value;\n var name = target.name;\n this.props.onMetadataChange(name, value);\n }\n }, {\n key: 'handleSelect',\n value: function handleSelect(event) {\n var name = event.target.name;\n var selectedOption = event.target.selectedOptions[0].value;\n this.props.onMetadataChange(name, selectedOption);\n }\n }, {\n key: 'render',\n value: function render() {\n return _react2.default.createElement(\n 'div',\n { id: 'publish-details', className: 'row row--padded row--no-top row--wide' },\n this.props.showMetadataInputs && _react2.default.createElement(\n 'div',\n null,\n _react2.default.createElement(\n 'div',\n { className: 'row row--no-top' },\n _react2.default.createElement(\n 'div',\n { className: 'column column--3 column--med-10 align-content-top' },\n _react2.default.createElement(\n 'label',\n { htmlFor: 'publish-license', className: 'label' },\n 'Description:'\n )\n ),\n _react2.default.createElement(\n 'div',\n { className: 'column column--7 column--sml-10' },\n _react2.default.createElement(_ExpandingTextArea2.default, {\n id: 'publish-description',\n className: 'textarea textarea--primary textarea--full-width',\n rows: 1,\n maxLength: 2000,\n style: { maxHeight: 200 },\n name: 'description',\n placeholder: 'Optional description',\n value: this.props.description,\n onChange: this.handleInput })\n )\n ),\n _react2.default.createElement(\n 'div',\n { className: 'row row--no-top' },\n _react2.default.createElement(\n 'div',\n { className: 'column column--3 column--med-10' },\n _react2.default.createElement(\n 'label',\n { htmlFor: 'publish-license', className: 'label' },\n 'License:'\n )\n ),\n _react2.default.createElement(\n 'div',\n { className: 'column column--7 column--sml-10' },\n _react2.default.createElement(\n 'select',\n { type: 'text', name: 'license', id: 'publish-license', className: 'select select--primary', onChange: this.handleSelect },\n _react2.default.createElement(\n 'option',\n { value: ' ' },\n 'Unspecified'\n ),\n _react2.default.createElement(\n 'option',\n { value: 'Public Domain' },\n 'Public Domain'\n ),\n _react2.default.createElement(\n 'option',\n { value: 'Creative Commons' },\n 'Creative Commons'\n )\n )\n )\n ),\n _react2.default.createElement(\n 'div',\n { className: 'row row--no-top' },\n _react2.default.createElement(\n 'div',\n { className: 'column column--3' },\n _react2.default.createElement(\n 'label',\n { htmlFor: 'publish-nsfw', className: 'label' },\n 'Mature:'\n )\n ),\n _react2.default.createElement(\n 'div',\n { className: 'column column--7' },\n _react2.default.createElement('input', { className: 'input-checkbox', type: 'checkbox', id: 'publish-nsfw', name: 'nsfw', value: this.props.nsfw, onChange: this.handleInput })\n )\n )\n ),\n _react2.default.createElement(\n 'button',\n { className: 'button--secondary', onClick: this.toggleShowInputs },\n this.props.showMetadataInputs ? 'less' : 'more'\n )\n );\n }\n }]);\n\n return PublishMetadataInputs;\n}(_react2.default.Component);\n\nexports.default = PublishMetadataInputs;\n\n/***/ }),\n/* 107 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(10);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar ExpandingTextarea = function (_Component) {\n _inherits(ExpandingTextarea, _Component);\n\n function ExpandingTextarea(props) {\n _classCallCheck(this, ExpandingTextarea);\n\n var _this = _possibleConstructorReturn(this, (ExpandingTextarea.__proto__ || Object.getPrototypeOf(ExpandingTextarea)).call(this, props));\n\n _this._handleChange = _this._handleChange.bind(_this);\n return _this;\n }\n\n _createClass(ExpandingTextarea, [{\n key: 'componentDidMount',\n value: function componentDidMount() {\n this.adjustTextarea({});\n }\n }, {\n key: '_handleChange',\n value: function _handleChange(event) {\n var onChange = this.props.onChange;\n\n if (onChange) onChange(event);\n this.adjustTextarea(event);\n }\n }, {\n key: 'adjustTextarea',\n value: function adjustTextarea(_ref) {\n var _ref$target = _ref.target,\n target = _ref$target === undefined ? this.el : _ref$target;\n\n target.style.height = 0;\n target.style.height = target.scrollHeight + 'px';\n }\n }, {\n key: 'render',\n value: function render() {\n var _this2 = this;\n\n var rest = _objectWithoutProperties(this.props, []);\n\n return _react2.default.createElement('textarea', _extends({}, rest, {\n ref: function ref(x) {\n return _this2.el = x;\n },\n onChange: this._handleChange\n }));\n }\n }]);\n\n return ExpandingTextarea;\n}(_react.Component);\n\nExpandingTextarea.propTypes = {\n onChange: _propTypes2.default.func\n};\n\nexports.default = ExpandingTextarea;\n\n/***/ }),\n/* 108 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _reactRedux = __webpack_require__(1);\n\nvar _publish = __webpack_require__(5);\n\nvar _view = __webpack_require__(109);\n\nvar _view2 = _interopRequireDefault(_view);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar mapStateToProps = function mapStateToProps(_ref) {\n var channel = _ref.channel,\n publish = _ref.publish;\n\n return {\n loggedInChannelName: channel.loggedInChannel.name,\n publishInChannel: publish.publishInChannel,\n selectedChannel: publish.selectedChannel,\n channelError: publish.error.channel\n };\n};\n\nvar mapDispatchToProps = function mapDispatchToProps(dispatch) {\n return {\n onPublishInChannelChange: function onPublishInChannelChange(value) {\n dispatch((0, _publish.updateError)('channel', null));\n dispatch((0, _publish.setPublishInChannel)(value));\n },\n onChannelSelect: function onChannelSelect(value) {\n dispatch((0, _publish.updateError)('channel', null));\n dispatch((0, _publish.updateSelectedChannel)(value));\n }\n };\n};\n\nexports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(_view2.default);\n\n/***/ }),\n/* 109 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _ChannelLoginForm = __webpack_require__(38);\n\nvar _ChannelLoginForm2 = _interopRequireDefault(_ChannelLoginForm);\n\nvar _ChannelCreateForm = __webpack_require__(39);\n\nvar _ChannelCreateForm2 = _interopRequireDefault(_ChannelCreateForm);\n\nvar _publish_channel_select_states = __webpack_require__(32);\n\nvar states = _interopRequireWildcard(_publish_channel_select_states);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar ChannelSelect = function (_React$Component) {\n _inherits(ChannelSelect, _React$Component);\n\n function ChannelSelect(props) {\n _classCallCheck(this, ChannelSelect);\n\n var _this = _possibleConstructorReturn(this, (ChannelSelect.__proto__ || Object.getPrototypeOf(ChannelSelect)).call(this, props));\n\n _this.toggleAnonymousPublish = _this.toggleAnonymousPublish.bind(_this);\n _this.handleSelection = _this.handleSelection.bind(_this);\n return _this;\n }\n\n _createClass(ChannelSelect, [{\n key: 'toggleAnonymousPublish',\n value: function toggleAnonymousPublish(event) {\n var value = event.target.value;\n if (value === 'anonymous') {\n this.props.onPublishInChannelChange(false);\n } else {\n this.props.onPublishInChannelChange(true);\n }\n }\n }, {\n key: 'handleSelection',\n value: function handleSelection(event) {\n var selectedOption = event.target.selectedOptions[0].value;\n this.props.onChannelSelect(selectedOption);\n }\n }, {\n key: 'render',\n value: function render() {\n return _react2.default.createElement(\n 'div',\n null,\n _react2.default.createElement(\n 'form',\n null,\n _react2.default.createElement(\n 'div',\n { className: 'column column--3 column--med-10' },\n _react2.default.createElement('input', { type: 'radio', name: 'anonymous-or-channel', id: 'anonymous-radio', className: 'input-radio', value: 'anonymous', checked: !this.props.publishInChannel, onChange: this.toggleAnonymousPublish }),\n _react2.default.createElement(\n 'label',\n { className: 'label label--pointer', htmlFor: 'anonymous-radio' },\n 'Anonymous'\n )\n ),\n _react2.default.createElement(\n 'div',\n { className: 'column column--7 column--med-10' },\n _react2.default.createElement('input', { type: 'radio', name: 'anonymous-or-channel', id: 'channel-radio', className: 'input-radio', value: 'in a channel', checked: this.props.publishInChannel, onChange: this.toggleAnonymousPublish }),\n _react2.default.createElement(\n 'label',\n { className: 'label label--pointer', htmlFor: 'channel-radio' },\n 'In a channel'\n )\n ),\n this.props.channelError ? _react2.default.createElement(\n 'p',\n { className: 'info-message--failure' },\n this.props.channelError\n ) : _react2.default.createElement(\n 'p',\n { className: 'info-message' },\n 'Publish anonymously or in a channel'\n )\n ),\n this.props.publishInChannel && _react2.default.createElement(\n 'div',\n null,\n _react2.default.createElement(\n 'div',\n { className: 'column column--3' },\n _react2.default.createElement(\n 'label',\n { className: 'label', htmlFor: 'channel-name-select' },\n 'Channel:'\n )\n ),\n _react2.default.createElement(\n 'div',\n { className: 'column column--7' },\n _react2.default.createElement(\n 'select',\n { type: 'text', id: 'channel-name-select', className: 'select select--arrow', value: this.props.selectedChannel, onChange: this.handleSelection },\n this.props.loggedInChannelName && _react2.default.createElement(\n 'option',\n { value: this.props.loggedInChannelName, id: 'publish-channel-select-channel-option' },\n this.props.loggedInChannelName\n ),\n _react2.default.createElement(\n 'option',\n { value: states.LOGIN },\n 'Existing'\n ),\n _react2.default.createElement(\n 'option',\n { value: states.CREATE },\n 'New'\n )\n )\n ),\n this.props.selectedChannel === states.LOGIN && _react2.default.createElement(_ChannelLoginForm2.default, null),\n this.props.selectedChannel === states.CREATE && _react2.default.createElement(_ChannelCreateForm2.default, null)\n )\n );\n }\n }]);\n\n return ChannelSelect;\n}(_react2.default.Component);\n\nexports.default = ChannelSelect;\n\n/***/ }),\n/* 110 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _request = __webpack_require__(11);\n\nvar _request2 = _interopRequireDefault(_request);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar ChannelLoginForm = function (_React$Component) {\n _inherits(ChannelLoginForm, _React$Component);\n\n function ChannelLoginForm(props) {\n _classCallCheck(this, ChannelLoginForm);\n\n var _this = _possibleConstructorReturn(this, (ChannelLoginForm.__proto__ || Object.getPrototypeOf(ChannelLoginForm)).call(this, props));\n\n _this.state = {\n error: null,\n name: '',\n password: ''\n };\n _this.handleInput = _this.handleInput.bind(_this);\n _this.loginToChannel = _this.loginToChannel.bind(_this);\n return _this;\n }\n\n _createClass(ChannelLoginForm, [{\n key: 'handleInput',\n value: function handleInput(event) {\n var name = event.target.name;\n var value = event.target.value;\n this.setState(_defineProperty({}, name, value));\n }\n }, {\n key: 'loginToChannel',\n value: function loginToChannel(event) {\n var _this2 = this;\n\n event.preventDefault();\n var params = {\n method: 'POST',\n body: JSON.stringify({ username: this.state.name, password: this.state.password }),\n headers: new Headers({\n 'Content-Type': 'application/json'\n }),\n credentials: 'include'\n };\n (0, _request2.default)('login', params).then(function (_ref) {\n var success = _ref.success,\n channelName = _ref.channelName,\n shortChannelId = _ref.shortChannelId,\n channelClaimId = _ref.channelClaimId,\n message = _ref.message;\n\n if (success) {\n _this2.props.onChannelLogin(channelName, shortChannelId, channelClaimId);\n } else {\n _this2.setState({ 'error': message });\n };\n }).catch(function (error) {\n if (error.message) {\n _this2.setState({ 'error': error.message });\n } else {\n _this2.setState({ 'error': error });\n }\n });\n }\n }, {\n key: 'render',\n value: function render() {\n return _react2.default.createElement(\n 'form',\n { id: 'channel-login-form' },\n _react2.default.createElement(\n 'div',\n { className: 'row row--wide row--short' },\n _react2.default.createElement(\n 'div',\n { className: 'column column--3 column--sml-10' },\n _react2.default.createElement(\n 'label',\n { className: 'label', htmlFor: 'channel-login-name-input' },\n 'Name:'\n )\n ),\n _react2.default.createElement(\n 'div',\n { className: 'column column--6 column--sml-10' },\n _react2.default.createElement(\n 'div',\n { className: 'input-text--primary flex-container--row flex-container--left-bottom' },\n _react2.default.createElement(\n 'span',\n null,\n '@'\n ),\n _react2.default.createElement('input', { type: 'text', id: 'channel-login-name-input', className: 'input-text', name: 'name', placeholder: 'Your Channel Name', value: this.state.channelName, onChange: this.handleInput })\n )\n )\n ),\n _react2.default.createElement(\n 'div',\n { className: 'row row--wide row--short' },\n _react2.default.createElement(\n 'div',\n { className: 'column column--3 column--sml-10' },\n _react2.default.createElement(\n 'label',\n { className: 'label', htmlFor: 'channel-login-password-input' },\n 'Password:'\n )\n ),\n _react2.default.createElement(\n 'div',\n { className: 'column column--6 column--sml-10' },\n _react2.default.createElement(\n 'div',\n { className: 'input-text--primary' },\n _react2.default.createElement('input', { type: 'password', id: 'channel-login-password-input', name: 'password', className: 'input-text', placeholder: '', value: this.state.channelPassword, onChange: this.handleInput })\n )\n )\n ),\n this.state.error ? _react2.default.createElement(\n 'p',\n { className: 'info-message--failure' },\n this.state.error\n ) : _react2.default.createElement(\n 'p',\n { className: 'info-message' },\n 'Enter the name and password for your channel'\n ),\n _react2.default.createElement(\n 'div',\n { className: 'row row--wide' },\n _react2.default.createElement(\n 'button',\n { className: 'button--primary', onClick: this.loginToChannel },\n 'Authenticate'\n )\n )\n );\n }\n }]);\n\n return ChannelLoginForm;\n}(_react2.default.Component);\n\nexports.default = ChannelLoginForm;\n\n/***/ }),\n/* 111 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _ProgressBar = __webpack_require__(20);\n\nvar _ProgressBar2 = _interopRequireDefault(_ProgressBar);\n\nvar _request = __webpack_require__(11);\n\nvar _request2 = _interopRequireDefault(_request);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar ChannelCreateForm = function (_React$Component) {\n _inherits(ChannelCreateForm, _React$Component);\n\n function ChannelCreateForm(props) {\n _classCallCheck(this, ChannelCreateForm);\n\n var _this = _possibleConstructorReturn(this, (ChannelCreateForm.__proto__ || Object.getPrototypeOf(ChannelCreateForm)).call(this, props));\n\n _this.state = {\n error: null,\n channel: '',\n password: '',\n status: null\n };\n _this.handleChannelInput = _this.handleChannelInput.bind(_this);\n _this.handleInput = _this.handleInput.bind(_this);\n _this.createChannel = _this.createChannel.bind(_this);\n return _this;\n }\n\n _createClass(ChannelCreateForm, [{\n key: 'cleanseChannelInput',\n value: function cleanseChannelInput(input) {\n input = input.replace(/\\s+/g, '-'); // replace spaces with dashes\n input = input.replace(/[^A-Za-z0-9-]/g, ''); // remove all characters that are not A-Z, a-z, 0-9, or '-'\n return input;\n }\n }, {\n key: 'handleChannelInput',\n value: function handleChannelInput(event) {\n var value = event.target.value;\n value = this.cleanseChannelInput(value);\n this.setState({ channel: value });\n if (value) {\n this.updateIsChannelAvailable(value);\n } else {\n this.setState({ error: 'Please enter a channel name' });\n }\n }\n }, {\n key: 'handleInput',\n value: function handleInput(event) {\n var name = event.target.name;\n var value = event.target.value;\n this.setState(_defineProperty({}, name, value));\n }\n }, {\n key: 'updateIsChannelAvailable',\n value: function updateIsChannelAvailable(channel) {\n var _this2 = this;\n\n var channelWithAtSymbol = '@' + channel;\n (0, _request2.default)('/api/channel/availability/' + channelWithAtSymbol).then(function (isAvailable) {\n if (isAvailable) {\n _this2.setState({ 'error': null });\n } else {\n _this2.setState({ 'error': 'That channel has already been claimed' });\n }\n }).catch(function (error) {\n _this2.setState({ 'error': error.message });\n });\n }\n }, {\n key: 'checkIsChannelAvailable',\n value: function checkIsChannelAvailable(channel) {\n var channelWithAtSymbol = '@' + channel;\n return new Promise(function (resolve, reject) {\n (0, _request2.default)('/api/channel/availability/' + channelWithAtSymbol).then(function (isAvailable) {\n if (!isAvailable) {\n return reject(new Error('That channel has already been claimed'));\n }\n resolve();\n }).catch(function (error) {\n reject(error);\n });\n });\n }\n }, {\n key: 'checkIsPasswordProvided',\n value: function checkIsPasswordProvided() {\n var password = this.state.password;\n return new Promise(function (resolve, reject) {\n if (!password || password.length < 1) {\n return reject(new Error('Please provide a password'));\n }\n resolve();\n });\n }\n }, {\n key: 'makePublishChannelRequest',\n value: function makePublishChannelRequest(username, password) {\n var params = {\n method: 'POST',\n body: JSON.stringify({ username: username, password: password }),\n headers: new Headers({\n 'Content-Type': 'application/json'\n }),\n credentials: 'include'\n };\n return new Promise(function (resolve, reject) {\n (0, _request2.default)('/signup', params).then(function (result) {\n return resolve(result);\n }).catch(function (error) {\n reject(new Error('Unfortunately, we encountered an error while creating your channel. Please let us know in Discord! ' + error.message));\n });\n });\n }\n }, {\n key: 'createChannel',\n value: function createChannel(event) {\n var _this3 = this;\n\n event.preventDefault();\n this.checkIsPasswordProvided().then(function () {\n return _this3.checkIsChannelAvailable(_this3.state.channel, _this3.state.password);\n }).then(function () {\n _this3.setState({ status: 'We are publishing your new channel. Sit tight...' });\n return _this3.makePublishChannelRequest(_this3.state.channel, _this3.state.password);\n }).then(function (result) {\n _this3.setState({ status: null });\n _this3.props.onChannelLogin(result.channelName, result.shortChannelId, result.channelClaimId);\n }).catch(function (error) {\n _this3.setState({ 'error': error.message, status: null });\n });\n }\n }, {\n key: 'render',\n value: function render() {\n return _react2.default.createElement(\n 'div',\n null,\n !this.state.status ? _react2.default.createElement(\n 'form',\n { id: 'publish-channel-form' },\n _react2.default.createElement(\n 'div',\n { className: 'row row--wide row--short' },\n _react2.default.createElement(\n 'div',\n { className: 'column column--3 column--sml-10' },\n _react2.default.createElement(\n 'label',\n { className: 'label', htmlFor: 'new-channel-name' },\n 'Name:'\n )\n ),\n _react2.default.createElement(\n 'div',\n { className: 'column column--6 column--sml-10' },\n _react2.default.createElement(\n 'div',\n { className: 'input-text--primary flex-container--row flex-container--left-bottom span--relative' },\n _react2.default.createElement(\n 'span',\n null,\n '@'\n ),\n _react2.default.createElement('input', { type: 'text', name: 'channel', id: 'new-channel-name', className: 'input-text', placeholder: 'exampleChannelName', value: this.state.channel, onChange: this.handleChannelInput }),\n this.state.channel && !this.state.error && _react2.default.createElement(\n 'span',\n { id: 'input-success-channel-name', className: 'info-message--success span--absolute' },\n '\\u2713'\n ),\n this.state.error && _react2.default.createElement(\n 'span',\n { id: 'input-success-channel-name', className: 'info-message--failure span--absolute' },\n '\\u2716'\n )\n )\n )\n ),\n _react2.default.createElement(\n 'div',\n { className: 'row row--wide row--short' },\n _react2.default.createElement(\n 'div',\n { className: 'column column--3 column--sml-10' },\n _react2.default.createElement(\n 'label',\n { className: 'label', htmlFor: 'new-channel-password' },\n 'Password:'\n )\n ),\n _react2.default.createElement(\n 'div',\n { className: 'column column--6 column--sml-10' },\n _react2.default.createElement(\n 'div',\n { className: 'input-text--primary' },\n _react2.default.createElement('input', { type: 'password', name: 'password', id: 'new-channel-password', className: 'input-text', placeholder: '', value: this.state.password, onChange: this.handleInput })\n )\n )\n ),\n this.state.error ? _react2.default.createElement(\n 'p',\n { className: 'info-message--failure' },\n this.state.error\n ) : _react2.default.createElement(\n 'p',\n { className: 'info-message' },\n 'Choose a name and password for your channel'\n ),\n _react2.default.createElement(\n 'div',\n { className: 'row row--wide' },\n _react2.default.createElement(\n 'button',\n { className: 'button--primary', onClick: this.createChannel },\n 'Create Channel'\n )\n )\n ) : _react2.default.createElement(\n 'div',\n null,\n _react2.default.createElement(\n 'p',\n { className: 'fine-print' },\n this.state.status\n ),\n _react2.default.createElement(_ProgressBar2.default, { size: 12 })\n )\n );\n }\n }]);\n\n return ChannelCreateForm;\n}(_react2.default.Component);\n\nexports.default = ChannelCreateForm;\n\n/***/ }),\n/* 112 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar ActiveStatusBar = function ActiveStatusBar() {\n return _react2.default.createElement(\n 'span',\n { className: 'progress-bar progress-bar--active' },\n '| '\n );\n};\n\nexports.default = ActiveStatusBar;\n\n/***/ }),\n/* 113 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar InactiveStatusBar = function InactiveStatusBar() {\n return _react2.default.createElement(\n 'span',\n { className: 'progress-bar progress-bar--inactive' },\n '| '\n );\n};\n\nexports.default = InactiveStatusBar;\n\n/***/ }),\n/* 114 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _reactRedux = __webpack_require__(1);\n\nvar _publish = __webpack_require__(5);\n\nvar _view = __webpack_require__(115);\n\nvar _view2 = _interopRequireDefault(_view);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar mapStateToProps = function mapStateToProps(_ref) {\n var publish = _ref.publish;\n\n return {\n status: publish.status.status,\n message: publish.status.message\n };\n};\n\nvar mapDispatchToProps = {\n clearFile: _publish.clearFile\n};\n\nexports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(_view2.default);\n\n/***/ }),\n/* 115 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _ProgressBar = __webpack_require__(20);\n\nvar _ProgressBar2 = _interopRequireDefault(_ProgressBar);\n\nvar _publish_claim_states = __webpack_require__(116);\n\nvar publishStates = _interopRequireWildcard(_publish_claim_states);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar PublishStatus = function (_React$Component) {\n _inherits(PublishStatus, _React$Component);\n\n function PublishStatus() {\n _classCallCheck(this, PublishStatus);\n\n return _possibleConstructorReturn(this, (PublishStatus.__proto__ || Object.getPrototypeOf(PublishStatus)).apply(this, arguments));\n }\n\n _createClass(PublishStatus, [{\n key: 'render',\n value: function render() {\n var _props = this.props,\n status = _props.status,\n message = _props.message,\n clearFile = _props.clearFile;\n\n return _react2.default.createElement(\n 'div',\n { className: 'row row--tall flex-container--column flex-container--center-center' },\n status === publishStates.LOAD_START && _react2.default.createElement(\n 'div',\n { className: 'row align-content-center' },\n _react2.default.createElement(\n 'p',\n null,\n 'File is loading to server'\n ),\n _react2.default.createElement(\n 'p',\n { className: 'blue' },\n '0%'\n )\n ),\n status === publishStates.LOADING && _react2.default.createElement(\n 'div',\n null,\n _react2.default.createElement(\n 'div',\n { className: 'row align-content-center' },\n _react2.default.createElement(\n 'p',\n null,\n 'File is loading to server'\n ),\n _react2.default.createElement(\n 'p',\n { className: 'blue' },\n message\n )\n )\n ),\n status === publishStates.PUBLISHING && _react2.default.createElement(\n 'div',\n { className: 'row align-content-center' },\n _react2.default.createElement(\n 'p',\n null,\n 'Upload complete. Your file is now being published on the blockchain...'\n ),\n _react2.default.createElement(_ProgressBar2.default, { size: 12 }),\n _react2.default.createElement(\n 'p',\n null,\n 'Curious what magic is happening here? ',\n _react2.default.createElement(\n 'a',\n { className: 'link--primary', target: 'blank', href: 'https://lbry.io/faq/what-is-lbry' },\n 'Learn more.'\n )\n )\n ),\n status === publishStates.SUCCESS && _react2.default.createElement(\n 'div',\n { className: 'row align-content-center' },\n _react2.default.createElement(\n 'p',\n null,\n 'Your publish is complete! You are being redirected to it now.'\n ),\n _react2.default.createElement(\n 'p',\n null,\n 'If you are not automatically redirected, ',\n _react2.default.createElement(\n 'a',\n { className: 'link--primary', target: '_blank', href: message },\n 'click here.'\n )\n )\n ),\n status === publishStates.FAILED && _react2.default.createElement(\n 'div',\n { className: 'row align-content-center' },\n _react2.default.createElement(\n 'p',\n null,\n 'Something went wrong...'\n ),\n _react2.default.createElement(\n 'p',\n null,\n _react2.default.createElement(\n 'strong',\n null,\n message\n )\n ),\n _react2.default.createElement(\n 'p',\n null,\n 'For help, post the above error text in the #speech channel on the ',\n _react2.default.createElement(\n 'a',\n { className: 'link--primary', href: 'https://discord.gg/YjYbwhS', target: '_blank' },\n 'lbry discord'\n )\n ),\n _react2.default.createElement(\n 'button',\n { className: 'button--secondary', onClick: clearFile },\n 'Reset'\n )\n )\n );\n }\n }]);\n\n return PublishStatus;\n}(_react2.default.Component);\n\n;\n\nexports.default = PublishStatus;\n\n/***/ }),\n/* 116 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nvar LOAD_START = exports.LOAD_START = 'LOAD_START';\nvar LOADING = exports.LOADING = 'LOADING';\nvar PUBLISHING = exports.PUBLISHING = 'PUBLISHING';\nvar SUCCESS = exports.SUCCESS = 'SUCCESS';\nvar FAILED = exports.FAILED = 'FAILED';\n\n/***/ }),\n/* 117 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _NavBar = __webpack_require__(7);\n\nvar _NavBar2 = _interopRequireDefault(_NavBar);\n\nvar _SEO = __webpack_require__(9);\n\nvar _SEO2 = _interopRequireDefault(_SEO);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar AboutPage = function (_React$Component) {\n _inherits(AboutPage, _React$Component);\n\n function AboutPage() {\n _classCallCheck(this, AboutPage);\n\n return _possibleConstructorReturn(this, (AboutPage.__proto__ || Object.getPrototypeOf(AboutPage)).apply(this, arguments));\n }\n\n _createClass(AboutPage, [{\n key: 'render',\n value: function render() {\n return _react2.default.createElement(\n 'div',\n null,\n _react2.default.createElement(_SEO2.default, { pageTitle: 'About', pageUri: 'about' }),\n _react2.default.createElement(_NavBar2.default, null),\n _react2.default.createElement(\n 'div',\n { className: 'row row--padded' },\n _react2.default.createElement(\n 'div',\n { className: 'column column--5 column--med-10 align-content-top' },\n _react2.default.createElement(\n 'div',\n { className: 'column column--8 column--med-10' },\n _react2.default.createElement(\n 'p',\n { className: 'pull-quote' },\n 'Spee.ch is an open-source project. Please contribute to the existing site, or fork it and make your own.'\n ),\n _react2.default.createElement(\n 'p',\n null,\n _react2.default.createElement(\n 'a',\n { className: 'link--primary', target: '_blank', href: 'https://twitter.com/spee_ch' },\n 'TWITTER'\n )\n ),\n _react2.default.createElement(\n 'p',\n null,\n _react2.default.createElement(\n 'a',\n { className: 'link--primary', target: '_blank', href: 'https://github.com/lbryio/spee.ch' },\n 'GITHUB'\n )\n ),\n _react2.default.createElement(\n 'p',\n null,\n _react2.default.createElement(\n 'a',\n { className: 'link--primary', target: '_blank', href: 'https://discord.gg/YjYbwhS' },\n 'DISCORD CHANNEL'\n )\n ),\n _react2.default.createElement(\n 'p',\n null,\n _react2.default.createElement(\n 'a',\n { className: 'link--primary', target: '_blank', href: 'https://github.com/lbryio/spee.ch/blob/master/README.md' },\n 'DOCUMENTATION'\n )\n )\n )\n ),\n _react2.default.createElement(\n 'div',\n { className: 'column column--5 column--med-10 align-content-top' },\n _react2.default.createElement(\n 'div',\n { className: 'column column--8 column--med-10' },\n _react2.default.createElement(\n 'p',\n null,\n 'Spee.ch is a media-hosting site that reads from and publishes content to the ',\n _react2.default.createElement(\n 'a',\n { className: 'link--primary', href: 'https://lbry.io' },\n 'LBRY'\n ),\n ' blockchain.'\n ),\n _react2.default.createElement(\n 'p',\n null,\n 'Spee.ch is a hosting service, but with the added benefit that it stores your content on a decentralized network of computers -- the LBRY network. This means that your images are stored in multiple locations without a single point of failure.'\n ),\n _react2.default.createElement(\n 'h3',\n null,\n 'Contribute'\n ),\n _react2.default.createElement(\n 'p',\n null,\n 'If you have an idea for your own spee.ch-like site on top of LBRY, fork our ',\n _react2.default.createElement(\n 'a',\n { className: 'link--primary', href: 'https://github.com/lbryio/spee.ch' },\n 'github repo'\n ),\n ' and go to town!'\n ),\n _react2.default.createElement(\n 'p',\n null,\n 'If you want to improve spee.ch, join our ',\n _react2.default.createElement(\n 'a',\n { className: 'link--primary', href: 'https://discord.gg/YjYbwhS' },\n 'discord channel'\n ),\n ' or solve one of our ',\n _react2.default.createElement(\n 'a',\n { className: 'link--primary', href: 'https://github.com/lbryio/spee.ch/issues' },\n 'github issues'\n ),\n '.'\n )\n )\n )\n )\n );\n }\n }]);\n\n return AboutPage;\n}(_react2.default.Component);\n\n;\n\nexports.default = AboutPage;\n\n/***/ }),\n/* 118 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _reactRedux = __webpack_require__(1);\n\nvar _view = __webpack_require__(119);\n\nvar _view2 = _interopRequireDefault(_view);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar mapStateToProps = function mapStateToProps(_ref) {\n var channel = _ref.channel;\n\n return {\n loggedInChannelName: channel.loggedInChannel.name\n };\n};\n\nexports.default = (0, _reactRedux.connect)(mapStateToProps, null)(_view2.default);\n\n/***/ }),\n/* 119 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _reactRouterDom = __webpack_require__(4);\n\nvar _SEO = __webpack_require__(9);\n\nvar _SEO2 = _interopRequireDefault(_SEO);\n\nvar _NavBar = __webpack_require__(7);\n\nvar _NavBar2 = _interopRequireDefault(_NavBar);\n\nvar _ChannelLoginForm = __webpack_require__(38);\n\nvar _ChannelLoginForm2 = _interopRequireDefault(_ChannelLoginForm);\n\nvar _ChannelCreateForm = __webpack_require__(39);\n\nvar _ChannelCreateForm2 = _interopRequireDefault(_ChannelCreateForm);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar LoginPage = function (_React$Component) {\n _inherits(LoginPage, _React$Component);\n\n function LoginPage() {\n _classCallCheck(this, LoginPage);\n\n return _possibleConstructorReturn(this, (LoginPage.__proto__ || Object.getPrototypeOf(LoginPage)).apply(this, arguments));\n }\n\n _createClass(LoginPage, [{\n key: 'componentWillReceiveProps',\n value: function componentWillReceiveProps(newProps) {\n // re-route the user to the homepage if the user is logged in\n if (newProps.loggedInChannelName !== this.props.loggedInChannelName) {\n this.props.history.push('/');\n }\n }\n }, {\n key: 'render',\n value: function render() {\n return _react2.default.createElement(\n 'div',\n null,\n _react2.default.createElement(_SEO2.default, { pageTitle: 'Login', pageUri: 'login' }),\n _react2.default.createElement(_NavBar2.default, null),\n _react2.default.createElement(\n 'div',\n { className: 'row row--padded' },\n _react2.default.createElement(\n 'div',\n { className: 'column column--5 column--med-10 align-content-top' },\n _react2.default.createElement(\n 'div',\n { className: 'column column--8 column--med-10' },\n _react2.default.createElement(\n 'p',\n null,\n 'Channels allow you to publish and group content under an identity. You can create a channel for yourself, or share one with like-minded friends. You can create 1 channel, or 100, so whether you\\'re ',\n _react2.default.createElement(\n 'a',\n { className: 'link--primary', target: '_blank', href: '/@catalonia2017:43dcf47163caa21d8404d9fe9b30f78ef3e146a8' },\n 'documenting important events'\n ),\n ', or making a public repository for ',\n _react2.default.createElement(\n 'a',\n { className: 'link--primary', target: '_blank', href: '/@catGifs' },\n 'cat gifs'\n ),\n ' (password: \\'1234\\'), try creating a channel for it!'\n )\n )\n ),\n _react2.default.createElement(\n 'div',\n { className: 'column column--5 column--med-10 align-content-top' },\n _react2.default.createElement(\n 'div',\n { className: 'column column--8 column--med-10' },\n _react2.default.createElement(\n 'h3',\n { className: 'h3--no-bottom' },\n 'Log in to an existing channel:'\n ),\n _react2.default.createElement(_ChannelLoginForm2.default, null),\n _react2.default.createElement(\n 'h3',\n { className: 'h3--no-bottom' },\n 'Create a brand new channel:'\n ),\n _react2.default.createElement(_ChannelCreateForm2.default, null)\n )\n )\n )\n );\n }\n }]);\n\n return LoginPage;\n}(_react2.default.Component);\n\n;\n\nexports.default = (0, _reactRouterDom.withRouter)(LoginPage);\n\n/***/ }),\n/* 120 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _reactRedux = __webpack_require__(1);\n\nvar _show = __webpack_require__(8);\n\nvar _view = __webpack_require__(121);\n\nvar _view2 = _interopRequireDefault(_view);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar mapStateToProps = function mapStateToProps(_ref) {\n var show = _ref.show;\n\n return {\n error: show.request.error,\n requestType: show.request.type\n };\n};\n\nvar mapDispatchToProps = {\n onHandleShowPageUri: _show.onHandleShowPageUri\n};\n\nexports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(_view2.default);\n\n/***/ }),\n/* 121 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _ErrorPage = __webpack_require__(21);\n\nvar _ErrorPage2 = _interopRequireDefault(_ErrorPage);\n\nvar _ShowAssetLite = __webpack_require__(122);\n\nvar _ShowAssetLite2 = _interopRequireDefault(_ShowAssetLite);\n\nvar _ShowAssetDetails = __webpack_require__(125);\n\nvar _ShowAssetDetails2 = _interopRequireDefault(_ShowAssetDetails);\n\nvar _ShowChannel = __webpack_require__(131);\n\nvar _ShowChannel2 = _interopRequireDefault(_ShowChannel);\n\nvar _show_request_types = __webpack_require__(40);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar ShowPage = function (_React$Component) {\n _inherits(ShowPage, _React$Component);\n\n function ShowPage() {\n _classCallCheck(this, ShowPage);\n\n return _possibleConstructorReturn(this, (ShowPage.__proto__ || Object.getPrototypeOf(ShowPage)).apply(this, arguments));\n }\n\n _createClass(ShowPage, [{\n key: 'componentDidMount',\n value: function componentDidMount() {\n this.props.onHandleShowPageUri(this.props.match.params);\n }\n }, {\n key: 'componentWillReceiveProps',\n value: function componentWillReceiveProps(nextProps) {\n if (nextProps.match.params !== this.props.match.params) {\n this.props.onHandleShowPageUri(nextProps.match.params);\n }\n }\n }, {\n key: 'render',\n value: function render() {\n var _props = this.props,\n error = _props.error,\n requestType = _props.requestType;\n\n if (error) {\n return _react2.default.createElement(_ErrorPage2.default, { error: error });\n }\n switch (requestType) {\n case _show_request_types.CHANNEL:\n return _react2.default.createElement(_ShowChannel2.default, null);\n case _show_request_types.ASSET_LITE:\n return _react2.default.createElement(_ShowAssetLite2.default, null);\n case _show_request_types.ASSET_DETAILS:\n return _react2.default.createElement(_ShowAssetDetails2.default, null);\n default:\n return _react2.default.createElement(\n 'p',\n null,\n 'loading...'\n );\n }\n }\n }]);\n\n return ShowPage;\n}(_react2.default.Component);\n\n;\n\nexports.default = ShowPage;\n\n/***/ }),\n/* 122 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _reactRedux = __webpack_require__(1);\n\nvar _view = __webpack_require__(123);\n\nvar _view2 = _interopRequireDefault(_view);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar mapStateToProps = function mapStateToProps(_ref) {\n var show = _ref.show;\n\n // select request info\n var requestId = show.request.id;\n // select asset info\n var asset = void 0;\n var request = show.requestList[requestId] || null;\n var assetList = show.assetList;\n if (request && assetList) {\n var assetKey = request.key; // note: just store this in the request\n asset = assetList[assetKey] || null;\n };\n // return props\n return {\n asset: asset\n };\n};\n\nexports.default = (0, _reactRedux.connect)(mapStateToProps, null)(_view2.default);\n\n/***/ }),\n/* 123 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _SEO = __webpack_require__(9);\n\nvar _SEO2 = _interopRequireDefault(_SEO);\n\nvar _reactRouterDom = __webpack_require__(4);\n\nvar _AssetDisplay = __webpack_require__(41);\n\nvar _AssetDisplay2 = _interopRequireDefault(_AssetDisplay);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar ShowLite = function (_React$Component) {\n _inherits(ShowLite, _React$Component);\n\n function ShowLite() {\n _classCallCheck(this, ShowLite);\n\n return _possibleConstructorReturn(this, (ShowLite.__proto__ || Object.getPrototypeOf(ShowLite)).apply(this, arguments));\n }\n\n _createClass(ShowLite, [{\n key: 'render',\n value: function render() {\n var asset = this.props.asset;\n\n if (asset) {\n var _asset$claimData = asset.claimData,\n name = _asset$claimData.name,\n claimId = _asset$claimData.claimId;\n\n return _react2.default.createElement(\n 'div',\n { className: 'row row--tall flex-container--column flex-container--center-center show-lite-container' },\n _react2.default.createElement(_SEO2.default, { pageTitle: name, asset: asset }),\n _react2.default.createElement(_AssetDisplay2.default, null),\n _react2.default.createElement(\n _reactRouterDom.Link,\n { id: 'asset-boilerpate', className: 'link--primary fine-print', to: '/' + claimId + '/' + name },\n 'hosted via Spee.ch'\n )\n );\n }\n return _react2.default.createElement(\n 'div',\n { className: 'row row--tall row--padded flex-container--column flex-container--center-center' },\n _react2.default.createElement(\n 'p',\n null,\n 'loading asset data...'\n )\n );\n }\n }]);\n\n return ShowLite;\n}(_react2.default.Component);\n\n;\n\nexports.default = ShowLite;\n\n/***/ }),\n/* 124 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _ProgressBar = __webpack_require__(20);\n\nvar _ProgressBar2 = _interopRequireDefault(_ProgressBar);\n\nvar _asset_display_states = __webpack_require__(34);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar AssetDisplay = function (_React$Component) {\n _inherits(AssetDisplay, _React$Component);\n\n function AssetDisplay() {\n _classCallCheck(this, AssetDisplay);\n\n return _possibleConstructorReturn(this, (AssetDisplay.__proto__ || Object.getPrototypeOf(AssetDisplay)).apply(this, arguments));\n }\n\n _createClass(AssetDisplay, [{\n key: 'componentDidMount',\n value: function componentDidMount() {\n var _props$asset$claimDat = this.props.asset.claimData,\n name = _props$asset$claimDat.name,\n claimId = _props$asset$claimDat.claimId;\n\n this.props.onFileRequest(name, claimId);\n }\n }, {\n key: 'render',\n value: function render() {\n var _props = this.props,\n status = _props.status,\n error = _props.error,\n _props$asset$claimDat2 = _props.asset.claimData,\n name = _props$asset$claimDat2.name,\n claimId = _props$asset$claimDat2.claimId,\n contentType = _props$asset$claimDat2.contentType,\n fileExt = _props$asset$claimDat2.fileExt,\n thumbnail = _props$asset$claimDat2.thumbnail;\n\n return _react2.default.createElement(\n 'div',\n { id: 'asset-display-component' },\n status === _asset_display_states.LOCAL_CHECK && _react2.default.createElement(\n 'div',\n null,\n _react2.default.createElement(\n 'p',\n null,\n 'Checking to see if Spee.ch has your asset locally...'\n )\n ),\n status === _asset_display_states.UNAVAILABLE && _react2.default.createElement(\n 'div',\n null,\n _react2.default.createElement(\n 'p',\n null,\n 'Sit tight, we\\'re searching the LBRY blockchain for your asset!'\n ),\n _react2.default.createElement(_ProgressBar2.default, { size: 12 }),\n _react2.default.createElement(\n 'p',\n null,\n 'Curious what magic is happening here? ',\n _react2.default.createElement(\n 'a',\n { className: 'link--primary', target: 'blank', href: 'https://lbry.io/faq/what-is-lbry' },\n 'Learn more.'\n )\n )\n ),\n status === _asset_display_states.ERROR && _react2.default.createElement(\n 'div',\n null,\n _react2.default.createElement(\n 'p',\n null,\n 'Unfortunately, we couldn\\'t download your asset from LBRY. You can help us out by sharing the below error message in the ',\n _react2.default.createElement(\n 'a',\n { className: 'link--primary', href: 'https://discord.gg/YjYbwhS', target: '_blank' },\n 'LBRY discord'\n ),\n '.'\n ),\n _react2.default.createElement(\n 'i',\n null,\n _react2.default.createElement(\n 'p',\n { id: 'error-message' },\n error\n )\n )\n ),\n status === _asset_display_states.AVAILABLE && function () {\n switch (contentType) {\n case 'image/jpeg':\n case 'image/jpg':\n case 'image/png':\n return _react2.default.createElement('img', {\n className: 'asset',\n src: '/' + claimId + '/' + name + '.' + fileExt,\n alt: name });\n case 'image/gif':\n return _react2.default.createElement('img', {\n className: 'asset',\n src: '/' + claimId + '/' + name + '.' + fileExt,\n alt: name\n });\n case 'video/mp4':\n return _react2.default.createElement(\n 'video',\n { className: 'asset video', controls: true, poster: thumbnail },\n _react2.default.createElement('source', {\n src: '/' + claimId + '/' + name + '.' + fileExt\n }),\n _react2.default.createElement(\n 'p',\n null,\n 'Your browser does not support the ',\n _react2.default.createElement(\n 'code',\n null,\n 'video'\n ),\n ' element.'\n )\n );\n default:\n return _react2.default.createElement(\n 'p',\n null,\n 'Unsupported file type'\n );\n }\n }()\n );\n }\n }]);\n\n return AssetDisplay;\n}(_react2.default.Component);\n\n;\n\nexports.default = AssetDisplay;\n\n/***/ }),\n/* 125 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _reactRedux = __webpack_require__(1);\n\nvar _view = __webpack_require__(126);\n\nvar _view2 = _interopRequireDefault(_view);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar mapStateToProps = function mapStateToProps(_ref) {\n var show = _ref.show;\n\n // select request info\n var requestId = show.request.id;\n // select asset info\n var asset = void 0;\n var request = show.requestList[requestId] || null;\n var assetList = show.assetList;\n if (request && assetList) {\n var assetKey = request.key; // note: just store this in the request\n asset = assetList[assetKey] || null;\n };\n // return props\n return {\n asset: asset\n };\n};\n\nexports.default = (0, _reactRedux.connect)(mapStateToProps, null)(_view2.default);\n\n/***/ }),\n/* 126 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _SEO = __webpack_require__(9);\n\nvar _SEO2 = _interopRequireDefault(_SEO);\n\nvar _NavBar = __webpack_require__(7);\n\nvar _NavBar2 = _interopRequireDefault(_NavBar);\n\nvar _ErrorPage = __webpack_require__(21);\n\nvar _ErrorPage2 = _interopRequireDefault(_ErrorPage);\n\nvar _AssetTitle = __webpack_require__(127);\n\nvar _AssetTitle2 = _interopRequireDefault(_AssetTitle);\n\nvar _AssetDisplay = __webpack_require__(41);\n\nvar _AssetDisplay2 = _interopRequireDefault(_AssetDisplay);\n\nvar _AssetInfo = __webpack_require__(129);\n\nvar _AssetInfo2 = _interopRequireDefault(_AssetInfo);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar ShowAssetDetails = function (_React$Component) {\n _inherits(ShowAssetDetails, _React$Component);\n\n function ShowAssetDetails() {\n _classCallCheck(this, ShowAssetDetails);\n\n return _possibleConstructorReturn(this, (ShowAssetDetails.__proto__ || Object.getPrototypeOf(ShowAssetDetails)).apply(this, arguments));\n }\n\n _createClass(ShowAssetDetails, [{\n key: 'render',\n value: function render() {\n var asset = this.props.asset;\n\n if (asset) {\n var name = asset.claimData.name;\n\n return _react2.default.createElement(\n 'div',\n null,\n _react2.default.createElement(_SEO2.default, { pageTitle: name + ' - details', asset: asset }),\n _react2.default.createElement(_NavBar2.default, null),\n _react2.default.createElement(\n 'div',\n { className: 'row row--tall row--padded' },\n _react2.default.createElement(\n 'div',\n { className: 'column column--10' },\n _react2.default.createElement(_AssetTitle2.default, null)\n ),\n _react2.default.createElement(\n 'div',\n { className: 'column column--5 column--sml-10 align-content-top' },\n _react2.default.createElement(\n 'div',\n { className: 'row row--padded show-details-container' },\n _react2.default.createElement(_AssetDisplay2.default, null)\n )\n ),\n _react2.default.createElement(\n 'div',\n { className: 'column column--5 column--sml-10 align-content-top' },\n _react2.default.createElement(\n 'div',\n { className: 'row row--padded' },\n _react2.default.createElement(_AssetInfo2.default, null)\n )\n )\n ),\n '}'\n );\n };\n return _react2.default.createElement(_ErrorPage2.default, { error: 'loading asset data...' });\n }\n }]);\n\n return ShowAssetDetails;\n}(_react2.default.Component);\n\n;\n\nexports.default = ShowAssetDetails;\n\n/***/ }),\n/* 127 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _reactRedux = __webpack_require__(1);\n\nvar _view = __webpack_require__(128);\n\nvar _view2 = _interopRequireDefault(_view);\n\nvar _show = __webpack_require__(13);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar mapStateToProps = function mapStateToProps(_ref) {\n var show = _ref.show;\n\n var _selectAsset = (0, _show.selectAsset)(show),\n title = _selectAsset.claimData.title;\n\n return {\n title: title\n };\n};\n\nexports.default = (0, _reactRedux.connect)(mapStateToProps, null)(_view2.default);\n\n/***/ }),\n/* 128 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar AssetTitle = function AssetTitle(_ref) {\n var title = _ref.title;\n\n return _react2.default.createElement(\n 'div',\n null,\n _react2.default.createElement(\n 'span',\n { className: 'text--large' },\n title\n )\n );\n};\n\nexports.default = AssetTitle;\n\n/***/ }),\n/* 129 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _reactRedux = __webpack_require__(1);\n\nvar _view = __webpack_require__(130);\n\nvar _view2 = _interopRequireDefault(_view);\n\nvar _show = __webpack_require__(13);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar mapStateToProps = function mapStateToProps(_ref) {\n var show = _ref.show;\n\n // select asset\n var asset = (0, _show.selectAsset)(show);\n // return props\n return {\n asset: asset\n };\n};\n\nexports.default = (0, _reactRedux.connect)(mapStateToProps, null)(_view2.default);\n\n/***/ }),\n/* 130 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _reactRouterDom = __webpack_require__(4);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar AssetInfo = function (_React$Component) {\n _inherits(AssetInfo, _React$Component);\n\n function AssetInfo(props) {\n _classCallCheck(this, AssetInfo);\n\n var _this = _possibleConstructorReturn(this, (AssetInfo.__proto__ || Object.getPrototypeOf(AssetInfo)).call(this, props));\n\n _this.copyToClipboard = _this.copyToClipboard.bind(_this);\n return _this;\n }\n\n _createClass(AssetInfo, [{\n key: 'copyToClipboard',\n value: function copyToClipboard(event) {\n var elementToCopy = event.target.dataset.elementtocopy;\n var element = document.getElementById(elementToCopy);\n element.select();\n try {\n document.execCommand('copy');\n } catch (err) {\n this.setState({ error: 'Oops, unable to copy' });\n }\n }\n }, {\n key: 'render',\n value: function render() {\n var _props$asset = this.props.asset,\n shortId = _props$asset.shortId,\n _props$asset$claimDat = _props$asset.claimData,\n channelName = _props$asset$claimDat.channelName,\n certificateId = _props$asset$claimDat.certificateId,\n description = _props$asset$claimDat.description,\n name = _props$asset$claimDat.name,\n claimId = _props$asset$claimDat.claimId,\n fileExt = _props$asset$claimDat.fileExt,\n contentType = _props$asset$claimDat.contentType,\n thumbnail = _props$asset$claimDat.thumbnail,\n host = _props$asset$claimDat.host;\n\n return _react2.default.createElement(\n 'div',\n null,\n channelName && _react2.default.createElement(\n 'div',\n { className: 'row row--padded row--wide row--no-top' },\n _react2.default.createElement(\n 'div',\n { className: 'column column--2 column--med-10' },\n _react2.default.createElement(\n 'span',\n { className: 'text' },\n 'Channel:'\n )\n ),\n _react2.default.createElement(\n 'div',\n { className: 'column column--8 column--med-10' },\n _react2.default.createElement(\n 'span',\n { className: 'text' },\n _react2.default.createElement(\n _reactRouterDom.Link,\n { to: '/' + channelName + ':' + certificateId },\n channelName\n )\n )\n )\n ),\n description && _react2.default.createElement(\n 'div',\n { className: 'row row--padded row--wide row--no-top' },\n _react2.default.createElement(\n 'span',\n { className: 'text' },\n description\n )\n ),\n _react2.default.createElement(\n 'div',\n { id: 'show-share-buttons' },\n _react2.default.createElement(\n 'div',\n { className: 'row row--padded row--wide row--no-top' },\n _react2.default.createElement(\n 'div',\n { className: 'column column--2 column--med-10' },\n _react2.default.createElement(\n 'span',\n { className: 'text' },\n 'Share:'\n )\n ),\n _react2.default.createElement(\n 'div',\n { className: 'column column--8 column--med-10' },\n _react2.default.createElement(\n 'div',\n {\n className: 'row row--short row--wide flex-container--row flex-container--space-between-bottom flex-container--wrap' },\n _react2.default.createElement(\n 'a',\n { className: 'link--primary', target: '_blank', href: 'https://twitter.com/intent/tweet?text=' + host + '/' + shortId + '/' + name },\n 'twitter'\n ),\n _react2.default.createElement(\n 'a',\n { className: 'link--primary', target: '_blank', href: 'https://www.facebook.com/sharer/sharer.php?u=' + host + '/' + shortId + '/' + name },\n 'facebook'\n ),\n _react2.default.createElement(\n 'a',\n { className: 'link--primary', target: '_blank', href: 'http://tumblr.com/widgets/share/tool?canonicalUrl=' + host + '/' + shortId + '/' + name },\n 'tumblr'\n ),\n _react2.default.createElement(\n 'a',\n { className: 'link--primary', target: '_blank', href: 'https://www.reddit.com/submit?url=' + host + '/' + shortId + '/' + name + '&title=' + name },\n 'reddit'\n )\n )\n )\n )\n ),\n _react2.default.createElement(\n 'div',\n { className: 'row row--padded row--wide row--no-top' },\n _react2.default.createElement(\n 'div',\n { id: 'show-short-link' },\n _react2.default.createElement(\n 'div',\n { className: 'column column--2 column--med-10' },\n _react2.default.createElement(\n 'span',\n { className: 'text' },\n 'Link:'\n )\n ),\n _react2.default.createElement(\n 'div',\n { className: 'column column--8 column--med-10' },\n _react2.default.createElement(\n 'div',\n { className: 'row row--short row--wide' },\n _react2.default.createElement(\n 'div',\n { className: 'column column--7' },\n _react2.default.createElement(\n 'div',\n { className: 'input-error', id: 'input-error-copy-short-link', hidden: 'true' },\n 'error here'\n ),\n _react2.default.createElement('input', { type: 'text', id: 'short-link', className: 'input-disabled input-text--full-width', readOnly: true,\n spellCheck: 'false',\n value: host + '/' + shortId + '/' + name + '.' + fileExt,\n onClick: this.select })\n ),\n _react2.default.createElement('div', { className: 'column column--1' }),\n _react2.default.createElement(\n 'div',\n { className: 'column column--2' },\n _react2.default.createElement(\n 'button',\n { className: 'button--primary button--wide', 'data-elementtocopy': 'short-link',\n onClick: this.copyToClipboard },\n 'copy'\n )\n )\n )\n )\n ),\n _react2.default.createElement(\n 'div',\n { id: 'show-embed-code' },\n _react2.default.createElement(\n 'div',\n { className: 'column column--2 column--med-10' },\n _react2.default.createElement(\n 'span',\n { className: 'text' },\n 'Embed:'\n )\n ),\n _react2.default.createElement(\n 'div',\n { className: 'column column--8 column--med-10' },\n _react2.default.createElement(\n 'div',\n { className: 'row row--short row--wide' },\n _react2.default.createElement(\n 'div',\n { className: 'column column--7' },\n _react2.default.createElement(\n 'div',\n { className: 'input-error', id: 'input-error-copy-embed-text', hidden: 'true' },\n 'error here'\n ),\n contentType === 'video/mp4' ? _react2.default.createElement('input', { type: 'text', id: 'embed-text', className: 'input-disabled input-text--full-width', readOnly: true,\n onClick: this.select, spellCheck: 'false',\n value: '' }) : _react2.default.createElement('input', { type: 'text', id: 'embed-text', className: 'input-disabled input-text--full-width', readOnly: true,\n onClick: this.select, spellCheck: 'false',\n value: ''\n })\n ),\n _react2.default.createElement('div', { className: 'column column--1' }),\n _react2.default.createElement(\n 'div',\n { className: 'column column--2' },\n _react2.default.createElement(\n 'button',\n { className: 'button--primary button--wide', 'data-elementtocopy': 'embed-text',\n onClick: this.copyToClipboard },\n 'copy'\n )\n )\n )\n )\n )\n ),\n _react2.default.createElement(\n 'div',\n { className: 'flex-container--row flex-container--space-between-bottom' },\n _react2.default.createElement(\n _reactRouterDom.Link,\n { className: 'link--primary', to: '/' + shortId + '/' + name + '.' + fileExt },\n _react2.default.createElement(\n 'span',\n {\n className: 'text' },\n 'Direct Link'\n )\n ),\n _react2.default.createElement(\n 'a',\n { className: 'link--primary', href: host + '/' + claimId + '/' + name + '.' + fileExt, download: name },\n 'Download'\n ),\n _react2.default.createElement(\n 'a',\n { className: 'link--primary', target: '_blank', href: 'https://lbry.io/dmca' },\n 'Report'\n )\n )\n );\n }\n }]);\n\n return AssetInfo;\n}(_react2.default.Component);\n\n;\n\nexports.default = AssetInfo;\n\n/***/ }),\n/* 131 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _reactRedux = __webpack_require__(1);\n\nvar _view = __webpack_require__(132);\n\nvar _view2 = _interopRequireDefault(_view);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar mapStateToProps = function mapStateToProps(_ref) {\n var show = _ref.show;\n\n // select request info\n var requestId = show.request.id;\n // select request\n var previousRequest = show.requestList[requestId] || null;\n // select channel\n var channel = void 0;\n if (previousRequest) {\n var channelKey = previousRequest.key;\n channel = show.channelList[channelKey] || null;\n }\n return {\n channel: channel\n };\n};\n\nexports.default = (0, _reactRedux.connect)(mapStateToProps, null)(_view2.default);\n\n/***/ }),\n/* 132 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _SEO = __webpack_require__(9);\n\nvar _SEO2 = _interopRequireDefault(_SEO);\n\nvar _ErrorPage = __webpack_require__(21);\n\nvar _ErrorPage2 = _interopRequireDefault(_ErrorPage);\n\nvar _NavBar = __webpack_require__(7);\n\nvar _NavBar2 = _interopRequireDefault(_NavBar);\n\nvar _ChannelClaimsDisplay = __webpack_require__(133);\n\nvar _ChannelClaimsDisplay2 = _interopRequireDefault(_ChannelClaimsDisplay);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar ShowChannel = function (_React$Component) {\n _inherits(ShowChannel, _React$Component);\n\n function ShowChannel() {\n _classCallCheck(this, ShowChannel);\n\n return _possibleConstructorReturn(this, (ShowChannel.__proto__ || Object.getPrototypeOf(ShowChannel)).apply(this, arguments));\n }\n\n _createClass(ShowChannel, [{\n key: 'render',\n value: function render() {\n var channel = this.props.channel;\n\n if (channel) {\n var name = channel.name,\n longId = channel.longId,\n shortId = channel.shortId;\n\n return _react2.default.createElement(\n 'div',\n null,\n _react2.default.createElement(_SEO2.default, { pageTitle: name, channel: channel }),\n _react2.default.createElement(_NavBar2.default, null),\n _react2.default.createElement(\n 'div',\n { className: 'row row--tall row--padded' },\n _react2.default.createElement(\n 'div',\n { className: 'column column--10' },\n _react2.default.createElement(\n 'h2',\n null,\n 'channel name: ',\n name\n ),\n _react2.default.createElement(\n 'p',\n { className: 'fine-print' },\n 'full channel id: ',\n longId\n ),\n _react2.default.createElement(\n 'p',\n { className: 'fine-print' },\n 'short channel id: ',\n shortId\n )\n ),\n _react2.default.createElement(\n 'div',\n { className: 'column column--10' },\n _react2.default.createElement(_ChannelClaimsDisplay2.default, null)\n )\n )\n );\n };\n return _react2.default.createElement(_ErrorPage2.default, { error: 'loading channel data...' });\n }\n }]);\n\n return ShowChannel;\n}(_react2.default.Component);\n\n;\n\nexports.default = ShowChannel;\n\n/***/ }),\n/* 133 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _reactRedux = __webpack_require__(1);\n\nvar _show = __webpack_require__(8);\n\nvar _view = __webpack_require__(134);\n\nvar _view2 = _interopRequireDefault(_view);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar mapStateToProps = function mapStateToProps(_ref) {\n var show = _ref.show;\n\n // select channel key\n var request = show.requestList[show.request.id];\n var channelKey = request.key;\n // select channel claims\n var channel = show.channelList[channelKey] || null;\n // return props\n return {\n channelKey: channelKey,\n channel: channel\n };\n};\n\nvar mapDispatchToProps = {\n onUpdateChannelClaims: _show.onUpdateChannelClaims\n};\n\nexports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(_view2.default);\n\n/***/ }),\n/* 134 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _AssetPreview = __webpack_require__(135);\n\nvar _AssetPreview2 = _interopRequireDefault(_AssetPreview);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar ChannelClaimsDisplay = function (_React$Component) {\n _inherits(ChannelClaimsDisplay, _React$Component);\n\n function ChannelClaimsDisplay(props) {\n _classCallCheck(this, ChannelClaimsDisplay);\n\n var _this = _possibleConstructorReturn(this, (ChannelClaimsDisplay.__proto__ || Object.getPrototypeOf(ChannelClaimsDisplay)).call(this, props));\n\n _this.showNextResultsPage = _this.showNextResultsPage.bind(_this);\n _this.showPreviousResultsPage = _this.showPreviousResultsPage.bind(_this);\n return _this;\n }\n\n _createClass(ChannelClaimsDisplay, [{\n key: 'showPreviousResultsPage',\n value: function showPreviousResultsPage() {\n var currentPage = this.props.channel.claimsData.currentPage;\n\n var previousPage = parseInt(currentPage) - 1;\n this.showNewPage(previousPage);\n }\n }, {\n key: 'showNextResultsPage',\n value: function showNextResultsPage() {\n var currentPage = this.props.channel.claimsData.currentPage;\n\n var nextPage = parseInt(currentPage) + 1;\n this.showNewPage(nextPage);\n }\n }, {\n key: 'showNewPage',\n value: function showNewPage(page) {\n var _props = this.props,\n channelKey = _props.channelKey,\n _props$channel = _props.channel,\n name = _props$channel.name,\n longId = _props$channel.longId;\n\n this.props.onUpdateChannelClaims(channelKey, name, longId, page);\n }\n }, {\n key: 'render',\n value: function render() {\n var _props$channel$claims = this.props.channel.claimsData,\n claims = _props$channel$claims.claims,\n currentPage = _props$channel$claims.currentPage,\n totalPages = _props$channel$claims.totalPages;\n\n return _react2.default.createElement(\n 'div',\n { className: 'row row--tall' },\n claims.length > 0 ? _react2.default.createElement(\n 'div',\n null,\n claims.map(function (claim, index) {\n return _react2.default.createElement(_AssetPreview2.default, {\n claimData: claim,\n key: claim.name + '-' + index\n });\n }),\n _react2.default.createElement(\n 'div',\n null,\n currentPage > 1 && _react2.default.createElement(\n 'button',\n { className: 'button--secondary', onClick: this.showPreviousResultsPage },\n 'Previous Page'\n ),\n currentPage < totalPages && _react2.default.createElement(\n 'button',\n { className: 'button--secondary', onClick: this.showNextResultsPage },\n 'Next Page'\n )\n )\n ) : _react2.default.createElement(\n 'p',\n null,\n 'There are no claims in this channel'\n )\n );\n }\n }]);\n\n return ChannelClaimsDisplay;\n}(_react2.default.Component);\n\n;\n\nexports.default = ChannelClaimsDisplay;\n\n/***/ }),\n/* 135 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _reactRouterDom = __webpack_require__(4);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar _require = __webpack_require__(3),\n defaultThumbnail = _require.claim.defaultThumbnail;\n\nvar AssetPreview = function AssetPreview(_ref) {\n var _ref$claimData = _ref.claimData,\n name = _ref$claimData.name,\n claimId = _ref$claimData.claimId,\n fileExt = _ref$claimData.fileExt,\n contentType = _ref$claimData.contentType,\n thumbnail = _ref$claimData.thumbnail;\n\n var directSourceLink = claimId + '/' + name + '.' + fileExt;\n var showUrlLink = '/' + claimId + '/' + name;\n return _react2.default.createElement(\n 'div',\n { className: 'asset-holder' },\n _react2.default.createElement(\n _reactRouterDom.Link,\n { to: showUrlLink },\n function () {\n switch (contentType) {\n case 'image/jpeg':\n case 'image/jpg':\n case 'image/png':\n case 'image/gif':\n return _react2.default.createElement('img', {\n className: 'asset-preview',\n src: directSourceLink,\n alt: name\n });\n case 'video/mp4':\n return _react2.default.createElement('img', {\n className: 'asset-preview video',\n src: thumbnail || defaultThumbnail,\n alt: name\n });\n default:\n return _react2.default.createElement(\n 'p',\n null,\n 'unsupported file type'\n );\n }\n }()\n )\n );\n};\n\nexports.default = AssetPreview;\n\n/***/ }),\n/* 136 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _NavBar = __webpack_require__(7);\n\nvar _NavBar2 = _interopRequireDefault(_NavBar);\n\nvar _reactHelmet = __webpack_require__(14);\n\nvar _reactHelmet2 = _interopRequireDefault(_reactHelmet);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar _require = __webpack_require__(3),\n _require$site = _require.site,\n title = _require$site.title,\n host = _require$site.host;\n\nvar FourOhForPage = function (_React$Component) {\n _inherits(FourOhForPage, _React$Component);\n\n function FourOhForPage() {\n _classCallCheck(this, FourOhForPage);\n\n return _possibleConstructorReturn(this, (FourOhForPage.__proto__ || Object.getPrototypeOf(FourOhForPage)).apply(this, arguments));\n }\n\n _createClass(FourOhForPage, [{\n key: 'render',\n value: function render() {\n return _react2.default.createElement(\n 'div',\n null,\n _react2.default.createElement(\n _reactHelmet2.default,\n null,\n _react2.default.createElement(\n 'title',\n null,\n title,\n ' - 404'\n ),\n _react2.default.createElement('link', { rel: 'canonical', href: host + '/404' })\n ),\n _react2.default.createElement(_NavBar2.default, null),\n _react2.default.createElement(\n 'div',\n { className: 'row row--padded' },\n _react2.default.createElement(\n 'h2',\n null,\n '404'\n ),\n _react2.default.createElement(\n 'p',\n null,\n 'That page does not exist'\n )\n )\n );\n }\n }]);\n\n return FourOhForPage;\n}(_react2.default.Component);\n\n;\n\nexports.default = FourOhForPage;\n\n/***/ }),\n/* 137 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _require = __webpack_require__(17),\n sendGAServeEvent = _require.sendGAServeEvent;\n\nvar _require2 = __webpack_require__(138),\n determineResponseType = _require2.determineResponseType,\n flipClaimNameAndIdForBackwardsCompatibility = _require2.flipClaimNameAndIdForBackwardsCompatibility,\n logRequestData = _require2.logRequestData,\n getClaimIdAndServeAsset = _require2.getClaimIdAndServeAsset;\n\nvar lbryUri = __webpack_require__(139);\nvar handleShowRender = __webpack_require__(140);\nvar SERVE = 'SERVE';\n\nmodule.exports = function (app) {\n // route to serve a specific asset using the channel or claim id\n app.get('/:identifier/:claim', function (req, res) {\n var headers = req.headers,\n ip = req.ip,\n originalUrl = req.originalUrl,\n params = req.params;\n // decide if this is a show request\n\n var hasFileExtension = void 0;\n try {\n var _lbryUri$parseModifie = lbryUri.parseModifier(params.claim);\n\n hasFileExtension = _lbryUri$parseModifie.hasFileExtension;\n } catch (error) {\n return res.status(400).json({ success: false, message: error.message });\n }\n var responseType = determineResponseType(hasFileExtension, headers);\n if (responseType !== SERVE) {\n return handleShowRender(req, res);\n }\n // handle serve request\n // send google analytics\n sendGAServeEvent(headers, ip, originalUrl);\n // parse the claim\n var claimName = void 0;\n try {\n var _lbryUri$parseClaim = lbryUri.parseClaim(params.claim);\n\n claimName = _lbryUri$parseClaim.claimName;\n } catch (error) {\n return res.status(400).json({ success: false, message: error.message });\n }\n // parse the identifier\n var isChannel = void 0,\n channelName = void 0,\n channelClaimId = void 0,\n claimId = void 0;\n try {\n var _lbryUri$parseIdentif = lbryUri.parseIdentifier(params.identifier);\n\n isChannel = _lbryUri$parseIdentif.isChannel;\n channelName = _lbryUri$parseIdentif.channelName;\n channelClaimId = _lbryUri$parseIdentif.channelClaimId;\n claimId = _lbryUri$parseIdentif.claimId;\n } catch (error) {\n return res.status(400).json({ success: false, message: error.message });\n }\n if (!isChannel) {\n var _flipClaimNameAndIdFo = flipClaimNameAndIdForBackwardsCompatibility(claimId, claimName);\n\n var _flipClaimNameAndIdFo2 = _slicedToArray(_flipClaimNameAndIdFo, 2);\n\n claimId = _flipClaimNameAndIdFo2[0];\n claimName = _flipClaimNameAndIdFo2[1];\n }\n // log the request data for debugging\n logRequestData(responseType, claimName, channelName, claimId);\n // get the claim Id and then serve the asset\n getClaimIdAndServeAsset(channelName, channelClaimId, claimName, claimId, originalUrl, ip, res);\n });\n // route to serve the winning asset at a claim or a channel page\n app.get('/:claim', function (req, res) {\n var headers = req.headers,\n ip = req.ip,\n originalUrl = req.originalUrl,\n params = req.params;\n // decide if this is a show request\n\n var hasFileExtension = void 0;\n try {\n var _lbryUri$parseModifie2 = lbryUri.parseModifier(params.claim);\n\n hasFileExtension = _lbryUri$parseModifie2.hasFileExtension;\n } catch (error) {\n return res.status(400).json({ success: false, message: error.message });\n }\n var responseType = determineResponseType(hasFileExtension, headers);\n if (responseType !== SERVE) {\n return handleShowRender(req, res);\n }\n // handle serve request\n // send google analytics\n sendGAServeEvent(headers, ip, originalUrl);\n // parse the claim\n var claimName = void 0;\n try {\n var _lbryUri$parseClaim2 = lbryUri.parseClaim(params.claim);\n\n claimName = _lbryUri$parseClaim2.claimName;\n } catch (error) {\n return res.status(400).json({ success: false, message: error.message });\n }\n // log the request data for debugging\n logRequestData(responseType, claimName, null, null);\n // get the claim Id and then serve the asset\n getClaimIdAndServeAsset(null, null, claimName, null, originalUrl, ip, res);\n });\n};\n\n/***/ }),\n/* 138 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar logger = __webpack_require__(2);\n\nvar _require = __webpack_require__(27),\n getClaimId = _require.getClaimId,\n getLocalFileRecord = _require.getLocalFileRecord;\n\nvar _require2 = __webpack_require__(26),\n handleErrorResponse = _require2.handleErrorResponse;\n\nvar SERVE = 'SERVE';\nvar SHOW = 'SHOW';\nvar NO_FILE = 'NO_FILE';\nvar NO_CHANNEL = 'NO_CHANNEL';\nvar NO_CLAIM = 'NO_CLAIM';\n\nfunction clientAcceptsHtml(_ref) {\n var accept = _ref.accept;\n\n return accept && accept.match(/text\\/html/);\n};\n\nfunction requestIsFromBrowser(headers) {\n return headers['user-agent'] && headers['user-agent'].match(/Mozilla/);\n};\n\nfunction clientWantsAsset(_ref2) {\n var accept = _ref2.accept,\n range = _ref2.range;\n\n var imageIsWanted = accept && accept.match(/image\\/.*/) && !accept.match(/text\\/html/) && !accept.match(/text\\/\\*/);\n var videoIsWanted = accept && range;\n return imageIsWanted || videoIsWanted;\n};\n\nfunction isValidClaimId(claimId) {\n return claimId.length === 40 && !/[^A-Za-z0-9]/g.test(claimId);\n};\n\nfunction isValidShortId(claimId) {\n return claimId.length === 1; // it should really evaluate the short url itself\n};\n\nfunction isValidShortIdOrClaimId(input) {\n return isValidClaimId(input) || isValidShortId(input);\n};\n\nfunction serveAssetToClient(claimId, name, res) {\n return getLocalFileRecord(claimId, name).then(function (fileRecord) {\n // check that a local record was found\n if (fileRecord === NO_FILE) {\n return res.status(307).redirect('/api/claim/get/' + name + '/' + claimId);\n }\n // serve the file\n var filePath = fileRecord.filePath,\n fileType = fileRecord.fileType;\n\n logger.verbose('serving file: ' + filePath);\n var sendFileOptions = {\n headers: {\n 'X-Content-Type-Options': 'nosniff',\n 'Content-Type': fileType || 'image/jpeg'\n }\n };\n res.status(200).sendFile(filePath, sendFileOptions);\n }).catch(function (error) {\n throw error;\n });\n};\n\nmodule.exports = {\n getClaimIdAndServeAsset: function getClaimIdAndServeAsset(channelName, channelClaimId, claimName, claimId, originalUrl, ip, res) {\n // get the claim Id and then serve the asset\n getClaimId(channelName, channelClaimId, claimName, claimId).then(function (fullClaimId) {\n if (fullClaimId === NO_CLAIM) {\n return res.status(404).json({ success: false, message: 'no claim id could be found' });\n } else if (fullClaimId === NO_CHANNEL) {\n return res.status(404).json({ success: false, message: 'no channel id could be found' });\n }\n serveAssetToClient(fullClaimId, claimName, res);\n // postToStats(responseType, originalUrl, ip, claimName, fullClaimId, 'success');\n }).catch(function (error) {\n handleErrorResponse(originalUrl, ip, error, res);\n // postToStats(responseType, originalUrl, ip, claimName, fullClaimId, 'fail');\n });\n },\n determineResponseType: function determineResponseType(hasFileExtension, headers) {\n var responseType = void 0;\n if (hasFileExtension) {\n responseType = SERVE; // assume a serve request if file extension is present\n if (clientAcceptsHtml(headers)) {\n // if the request comes from a browser, change it to a show request\n responseType = SHOW;\n }\n } else {\n responseType = SHOW;\n if (clientWantsAsset(headers) && requestIsFromBrowser(headers)) {\n // this is in case someone embeds a show url\n logger.debug('Show request came from browser but wants an image/video. Changing response to serve...');\n responseType = SERVE;\n }\n }\n return responseType;\n },\n flipClaimNameAndIdForBackwardsCompatibility: function flipClaimNameAndIdForBackwardsCompatibility(identifier, name) {\n // this is a patch for backwards compatability with '/name/claim_id' url format\n if (isValidShortIdOrClaimId(name) && !isValidShortIdOrClaimId(identifier)) {\n var tempName = name;\n name = identifier;\n identifier = tempName;\n }\n return [identifier, name];\n },\n logRequestData: function logRequestData(responseType, claimName, channelName, claimId) {\n logger.debug('responseType ===', responseType);\n logger.debug('claim name === ', claimName);\n logger.debug('channel name ===', channelName);\n logger.debug('claim id ===', claimId);\n }\n};\n\n/***/ }),\n/* 139 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar logger = __webpack_require__(2);\n\nmodule.exports = {\n REGEXP_INVALID_CLAIM: /[^A-Za-z0-9-]/g,\n REGEXP_INVALID_CHANNEL: /[^A-Za-z0-9-@]/g,\n REGEXP_ADDRESS: /^b(?=[^0OIl]{32,33})[0-9A-Za-z]{32,33}$/,\n CHANNEL_CHAR: '@',\n parseIdentifier: function parseIdentifier(identifier) {\n logger.debug('parsing identifier:', identifier);\n var componentsRegex = new RegExp('([^:$#/]*)' + // value (stops at the first separator or end)\n '([:$#]?)([^/]*)' // modifier separator, modifier (stops at the first path separator or end)\n );\n\n var _componentsRegex$exec = componentsRegex.exec(identifier).map(function (match) {\n return match || null;\n }),\n _componentsRegex$exec2 = _slicedToArray(_componentsRegex$exec, 4),\n proto = _componentsRegex$exec2[0],\n value = _componentsRegex$exec2[1],\n modifierSeperator = _componentsRegex$exec2[2],\n modifier = _componentsRegex$exec2[3];\n\n logger.debug(proto + ', ' + value + ', ' + modifierSeperator + ', ' + modifier);\n\n // Validate and process name\n if (!value) {\n throw new Error('Check your url. No channel name provided before \"' + modifierSeperator + '\"');\n }\n var isChannel = value.startsWith(module.exports.CHANNEL_CHAR);\n var channelName = isChannel ? value : null;\n var claimId = void 0;\n if (isChannel) {\n if (!channelName) {\n throw new Error('No channel name after @.');\n }\n var nameBadChars = channelName.match(module.exports.REGEXP_INVALID_CHANNEL);\n if (nameBadChars) {\n throw new Error('Invalid characters in channel name: ' + nameBadChars.join(', ') + '.');\n }\n } else {\n claimId = value;\n }\n\n // Validate and process modifier\n var channelClaimId = void 0;\n if (modifierSeperator) {\n if (!modifier) {\n throw new Error('No modifier provided after separator \"' + modifierSeperator + '\"');\n }\n\n if (modifierSeperator === ':') {\n channelClaimId = modifier;\n } else {\n throw new Error('The \"' + modifierSeperator + '\" modifier is not currently supported');\n }\n }\n return {\n isChannel: isChannel,\n channelName: channelName,\n channelClaimId: channelClaimId,\n claimId: claimId\n };\n },\n parseClaim: function parseClaim(claim) {\n logger.debug('parsing name:', claim);\n var componentsRegex = new RegExp('([^:$#/.]*)' + // name (stops at the first modifier)\n '([:$#.]?)([^/]*)' // modifier separator, modifier (stops at the first path separator or end)\n );\n\n var _componentsRegex$exec3 = componentsRegex.exec(claim).map(function (match) {\n return match || null;\n }),\n _componentsRegex$exec4 = _slicedToArray(_componentsRegex$exec3, 4),\n proto = _componentsRegex$exec4[0],\n claimName = _componentsRegex$exec4[1],\n modifierSeperator = _componentsRegex$exec4[2],\n modifier = _componentsRegex$exec4[3];\n\n logger.debug(proto + ', ' + claimName + ', ' + modifierSeperator + ', ' + modifier);\n\n // Validate and process name\n if (!claimName) {\n throw new Error('No claim name provided before .');\n }\n var nameBadChars = claimName.match(module.exports.REGEXP_INVALID_CLAIM);\n if (nameBadChars) {\n throw new Error('Invalid characters in claim name: ' + nameBadChars.join(', ') + '.');\n }\n // Validate and process modifier\n if (modifierSeperator) {\n if (!modifier) {\n throw new Error('No file extension provided after separator ' + modifierSeperator + '.');\n }\n if (modifierSeperator !== '.') {\n throw new Error('The ' + modifierSeperator + ' modifier is not supported in the claim name');\n }\n }\n // return results\n return {\n claimName: claimName\n };\n },\n parseModifier: function parseModifier(claim) {\n logger.debug('parsing modifier:', claim);\n var componentsRegex = new RegExp('([^:$#/.]*)' + // name (stops at the first modifier)\n '([:$#.]?)([^/]*)' // modifier separator, modifier (stops at the first path separator or end)\n );\n\n var _componentsRegex$exec5 = componentsRegex.exec(claim).map(function (match) {\n return match || null;\n }),\n _componentsRegex$exec6 = _slicedToArray(_componentsRegex$exec5, 4),\n proto = _componentsRegex$exec6[0],\n claimName = _componentsRegex$exec6[1],\n modifierSeperator = _componentsRegex$exec6[2],\n modifier = _componentsRegex$exec6[3];\n\n logger.debug(proto + ', ' + claimName + ', ' + modifierSeperator + ', ' + modifier);\n // Validate and process modifier\n var hasFileExtension = false;\n if (modifierSeperator) {\n hasFileExtension = true;\n }\n return {\n hasFileExtension: hasFileExtension\n };\n }\n};\n\n/***/ }),\n/* 140 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _server = __webpack_require__(29);\n\nvar _redux = __webpack_require__(18);\n\nvar _reducers = __webpack_require__(30);\n\nvar _reducers2 = _interopRequireDefault(_reducers);\n\nvar _reactRedux = __webpack_require__(1);\n\nvar _reactRouterDom = __webpack_require__(4);\n\nvar _GAListener = __webpack_require__(35);\n\nvar _GAListener2 = _interopRequireDefault(_GAListener);\n\nvar _app = __webpack_require__(36);\n\nvar _app2 = _interopRequireDefault(_app);\n\nvar _renderFullPage = __webpack_require__(42);\n\nvar _renderFullPage2 = _interopRequireDefault(_renderFullPage);\n\nvar _reduxSaga = __webpack_require__(141);\n\nvar _reduxSaga2 = _interopRequireDefault(_reduxSaga);\n\nvar _effects = __webpack_require__(15);\n\nvar _show_uri = __webpack_require__(142);\n\nvar _show = __webpack_require__(8);\n\nvar _reactHelmet = __webpack_require__(14);\n\nvar _reactHelmet2 = _interopRequireDefault(_reactHelmet);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar returnSagaWithParams = function returnSagaWithParams(saga, params) {\n return (/*#__PURE__*/regeneratorRuntime.mark(function _callee() {\n return regeneratorRuntime.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n _context.next = 2;\n return (0, _effects.call)(saga, params);\n\n case 2:\n case 'end':\n return _context.stop();\n }\n }\n }, _callee, this);\n })\n );\n};\n\nmodule.exports = function (req, res) {\n var context = {};\n\n // create and apply middleware\n var sagaMiddleware = (0, _reduxSaga2.default)();\n var middleware = (0, _redux.applyMiddleware)(sagaMiddleware);\n\n // create a new Redux store instance\n var store = (0, _redux.createStore)(_reducers2.default, middleware);\n\n // create saga\n var action = (0, _show.onHandleShowPageUri)(req.params);\n var saga = returnSagaWithParams(_show_uri.handleShowPageUri, action);\n\n // run the saga middleware\n sagaMiddleware.run(saga).done.then(function () {\n // render component to a string\n var html = (0, _server.renderToString)(_react2.default.createElement(\n _reactRedux.Provider,\n { store: store },\n _react2.default.createElement(\n _reactRouterDom.StaticRouter,\n { location: req.url, context: context },\n _react2.default.createElement(\n _GAListener2.default,\n null,\n _react2.default.createElement(_app2.default, null)\n )\n )\n ));\n\n // get head tags from helmet\n var helmet = _reactHelmet2.default.renderStatic();\n\n // check for a redirect\n if (context.url) {\n return res.redirect(301, context.url);\n }\n\n // get the initial state from our Redux store\n var preloadedState = store.getState();\n\n // send the rendered page back to the client\n res.send((0, _renderFullPage2.default)(helmet, html, preloadedState));\n });\n};\n\n/***/ }),\n/* 141 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"redux-saga\");\n\n/***/ }),\n/* 142 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.handleShowPageUri = handleShowPageUri;\nexports.watchHandleShowPageUri = watchHandleShowPageUri;\n\nvar _effects = __webpack_require__(15);\n\nvar _show_action_types = __webpack_require__(12);\n\nvar actions = _interopRequireWildcard(_show_action_types);\n\nvar _show = __webpack_require__(8);\n\nvar _show_asset = __webpack_require__(143);\n\nvar _show_channel = __webpack_require__(145);\n\nvar _lbryUri = __webpack_require__(147);\n\nvar _lbryUri2 = _interopRequireDefault(_lbryUri);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nvar _marked = /*#__PURE__*/regeneratorRuntime.mark(parseAndUpdateIdentifierAndClaim),\n _marked2 = /*#__PURE__*/regeneratorRuntime.mark(parseAndUpdateClaimOnly),\n _marked3 = /*#__PURE__*/regeneratorRuntime.mark(handleShowPageUri),\n _marked4 = /*#__PURE__*/regeneratorRuntime.mark(watchHandleShowPageUri);\n\nfunction parseAndUpdateIdentifierAndClaim(modifier, claim) {\n var isChannel, channelName, channelClaimId, claimId, claimName, extension, _lbryUri$parseIdentif, _lbryUri$parseClaim;\n\n return regeneratorRuntime.wrap(function parseAndUpdateIdentifierAndClaim$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n // this is a request for an asset\n // claim will be an asset claim\n // the identifier could be a channel or a claim id\n isChannel = void 0, channelName = void 0, channelClaimId = void 0, claimId = void 0, claimName = void 0, extension = void 0;\n _context.prev = 1;\n _lbryUri$parseIdentif = _lbryUri2.default.parseIdentifier(modifier);\n isChannel = _lbryUri$parseIdentif.isChannel;\n channelName = _lbryUri$parseIdentif.channelName;\n channelClaimId = _lbryUri$parseIdentif.channelClaimId;\n claimId = _lbryUri$parseIdentif.claimId;\n _lbryUri$parseClaim = _lbryUri2.default.parseClaim(claim);\n claimName = _lbryUri$parseClaim.claimName;\n extension = _lbryUri$parseClaim.extension;\n _context.next = 17;\n break;\n\n case 12:\n _context.prev = 12;\n _context.t0 = _context['catch'](1);\n _context.next = 16;\n return (0, _effects.put)((0, _show.onRequestError)(_context.t0.message));\n\n case 16:\n return _context.abrupt('return', _context.sent);\n\n case 17:\n if (!isChannel) {\n _context.next = 21;\n break;\n }\n\n _context.next = 20;\n return (0, _effects.call)(_show_asset.newAssetRequest, (0, _show.onNewAssetRequest)(claimName, null, channelName, channelClaimId, extension));\n\n case 20:\n return _context.abrupt('return', _context.sent);\n\n case 21:\n ;\n _context.next = 24;\n return (0, _effects.call)(_show_asset.newAssetRequest, (0, _show.onNewAssetRequest)(claimName, claimId, null, null, extension));\n\n case 24:\n case 'end':\n return _context.stop();\n }\n }\n }, _marked, this, [[1, 12]]);\n}\nfunction parseAndUpdateClaimOnly(claim) {\n var isChannel, channelName, channelClaimId, _lbryUri$parseIdentif2, claimName, extension, _lbryUri$parseClaim2;\n\n return regeneratorRuntime.wrap(function parseAndUpdateClaimOnly$(_context2) {\n while (1) {\n switch (_context2.prev = _context2.next) {\n case 0:\n // this could be a request for an asset or a channel page\n // claim could be an asset claim or a channel claim\n isChannel = void 0, channelName = void 0, channelClaimId = void 0;\n _context2.prev = 1;\n _lbryUri$parseIdentif2 = _lbryUri2.default.parseIdentifier(claim);\n isChannel = _lbryUri$parseIdentif2.isChannel;\n channelName = _lbryUri$parseIdentif2.channelName;\n channelClaimId = _lbryUri$parseIdentif2.channelClaimId;\n _context2.next = 13;\n break;\n\n case 8:\n _context2.prev = 8;\n _context2.t0 = _context2['catch'](1);\n _context2.next = 12;\n return (0, _effects.put)((0, _show.onRequestError)(_context2.t0.message));\n\n case 12:\n return _context2.abrupt('return', _context2.sent);\n\n case 13:\n if (!isChannel) {\n _context2.next = 17;\n break;\n }\n\n _context2.next = 16;\n return (0, _effects.call)(_show_channel.newChannelRequest, (0, _show.onNewChannelRequest)(channelName, channelClaimId));\n\n case 16:\n return _context2.abrupt('return', _context2.sent);\n\n case 17:\n // if not for a channel, parse the claim request\n claimName = void 0, extension = void 0;\n _context2.prev = 18;\n _lbryUri$parseClaim2 = _lbryUri2.default.parseClaim(claim);\n claimName = _lbryUri$parseClaim2.claimName;\n extension = _lbryUri$parseClaim2.extension;\n _context2.next = 29;\n break;\n\n case 24:\n _context2.prev = 24;\n _context2.t1 = _context2['catch'](18);\n _context2.next = 28;\n return (0, _effects.put)((0, _show.onRequestError)(_context2.t1.message));\n\n case 28:\n return _context2.abrupt('return', _context2.sent);\n\n case 29:\n _context2.next = 31;\n return (0, _effects.call)(_show_asset.newAssetRequest, (0, _show.onNewAssetRequest)(claimName, null, null, null, extension));\n\n case 31:\n case 'end':\n return _context2.stop();\n }\n }\n }, _marked2, this, [[1, 8], [18, 24]]);\n}\n\nfunction handleShowPageUri(action) {\n var _action$data, identifier, claim;\n\n return regeneratorRuntime.wrap(function handleShowPageUri$(_context3) {\n while (1) {\n switch (_context3.prev = _context3.next) {\n case 0:\n _action$data = action.data, identifier = _action$data.identifier, claim = _action$data.claim;\n\n if (!identifier) {\n _context3.next = 5;\n break;\n }\n\n _context3.next = 4;\n return (0, _effects.call)(parseAndUpdateIdentifierAndClaim, identifier, claim);\n\n case 4:\n return _context3.abrupt('return', _context3.sent);\n\n case 5:\n _context3.next = 7;\n return (0, _effects.call)(parseAndUpdateClaimOnly, claim);\n\n case 7:\n case 'end':\n return _context3.stop();\n }\n }\n }, _marked3, this);\n};\n\nfunction watchHandleShowPageUri() {\n return regeneratorRuntime.wrap(function watchHandleShowPageUri$(_context4) {\n while (1) {\n switch (_context4.prev = _context4.next) {\n case 0:\n _context4.next = 2;\n return (0, _effects.takeLatest)(actions.HANDLE_SHOW_URI, handleShowPageUri);\n\n case 2:\n case 'end':\n return _context4.stop();\n }\n }\n }, _marked4, this);\n};\n\n/***/ }),\n/* 143 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.newAssetRequest = newAssetRequest;\nexports.watchNewAssetRequest = watchNewAssetRequest;\n\nvar _effects = __webpack_require__(15);\n\nvar _show_action_types = __webpack_require__(12);\n\nvar actions = _interopRequireWildcard(_show_action_types);\n\nvar _show = __webpack_require__(8);\n\nvar _assetApi = __webpack_require__(144);\n\nvar _show2 = __webpack_require__(13);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nvar _marked = /*#__PURE__*/regeneratorRuntime.mark(newAssetRequest),\n _marked2 = /*#__PURE__*/regeneratorRuntime.mark(watchNewAssetRequest);\n\nfunction newAssetRequest(action) {\n var _action$data, requestType, requestId, name, modifier, state, longId, _ref, assetKey, shortId, _ref2, claimData, _ref3;\n\n return regeneratorRuntime.wrap(function newAssetRequest$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n _action$data = action.data, requestType = _action$data.requestType, requestId = _action$data.requestId, name = _action$data.name, modifier = _action$data.modifier;\n // put an action to update the request in redux\n\n _context.next = 3;\n return (0, _effects.put)((0, _show.onRequestUpdate)(requestType, requestId));\n\n case 3:\n _context.next = 5;\n return (0, _effects.select)(_show2.selectShowState);\n\n case 5:\n state = _context.sent;\n\n if (!state.requestList[requestId]) {\n _context.next = 8;\n break;\n }\n\n return _context.abrupt('return', null);\n\n case 8:\n // get long id && add request to request list\n longId = void 0;\n _context.prev = 9;\n _context.next = 12;\n return (0, _effects.call)(_assetApi.getLongClaimId, name, modifier);\n\n case 12:\n _ref = _context.sent;\n longId = _ref.data;\n _context.next = 21;\n break;\n\n case 16:\n _context.prev = 16;\n _context.t0 = _context['catch'](9);\n _context.next = 20;\n return (0, _effects.put)((0, _show.onRequestError)(_context.t0.message));\n\n case 20:\n return _context.abrupt('return', _context.sent);\n\n case 21:\n assetKey = 'a#' + name + '#' + longId;\n _context.next = 24;\n return (0, _effects.put)((0, _show.addRequestToRequestList)(requestId, null, assetKey));\n\n case 24:\n if (!state.assetList[assetKey]) {\n _context.next = 26;\n break;\n }\n\n return _context.abrupt('return', null);\n\n case 26:\n // get short Id\n shortId = void 0;\n _context.prev = 27;\n _context.next = 30;\n return (0, _effects.call)(_assetApi.getShortId, name, longId);\n\n case 30:\n _ref2 = _context.sent;\n shortId = _ref2.data;\n _context.next = 39;\n break;\n\n case 34:\n _context.prev = 34;\n _context.t1 = _context['catch'](27);\n _context.next = 38;\n return (0, _effects.put)((0, _show.onRequestError)(_context.t1.message));\n\n case 38:\n return _context.abrupt('return', _context.sent);\n\n case 39:\n // get asset claim data\n claimData = void 0;\n _context.prev = 40;\n _context.next = 43;\n return (0, _effects.call)(_assetApi.getClaimData, name, longId);\n\n case 43:\n _ref3 = _context.sent;\n claimData = _ref3.data;\n _context.next = 52;\n break;\n\n case 47:\n _context.prev = 47;\n _context.t2 = _context['catch'](40);\n _context.next = 51;\n return (0, _effects.put)((0, _show.onRequestError)(_context.t2.message));\n\n case 51:\n return _context.abrupt('return', _context.sent);\n\n case 52:\n _context.next = 54;\n return (0, _effects.put)((0, _show.addAssetToAssetList)(assetKey, null, name, longId, shortId, claimData));\n\n case 54:\n _context.next = 56;\n return (0, _effects.put)((0, _show.onRequestError)(null));\n\n case 56:\n case 'end':\n return _context.stop();\n }\n }\n }, _marked, this, [[9, 16], [27, 34], [40, 47]]);\n};\n\nfunction watchNewAssetRequest() {\n return regeneratorRuntime.wrap(function watchNewAssetRequest$(_context2) {\n while (1) {\n switch (_context2.prev = _context2.next) {\n case 0:\n _context2.next = 2;\n return (0, _effects.takeLatest)(actions.ASSET_REQUEST_NEW, newAssetRequest);\n\n case 2:\n case 'end':\n return _context2.stop();\n }\n }\n }, _marked2, this);\n};\n\n/***/ }),\n/* 144 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.getLongClaimId = getLongClaimId;\nexports.getShortId = getShortId;\nexports.getClaimData = getClaimData;\n\nvar _request = __webpack_require__(11);\n\nvar _request2 = _interopRequireDefault(_request);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar _require = __webpack_require__(3),\n host = _require.site.host;\n\nfunction getLongClaimId(name, modifier) {\n var body = {};\n // create request params\n if (modifier) {\n if (modifier.id) {\n body['claimId'] = modifier.id;\n } else {\n body['channelName'] = modifier.channel.name;\n body['channelClaimId'] = modifier.channel.id;\n }\n }\n body['claimName'] = name;\n var params = {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body)\n };\n // create url\n var url = host + '/api/claim/long-id';\n // return the request promise\n return (0, _request2.default)(url, params);\n};\n\nfunction getShortId(name, claimId) {\n var url = host + '/api/claim/short-id/' + claimId + '/' + name;\n return (0, _request2.default)(url);\n};\n\nfunction getClaimData(name, claimId) {\n var url = host + '/api/claim/data/' + name + '/' + claimId;\n return (0, _request2.default)(url);\n};\n\n/***/ }),\n/* 145 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.newChannelRequest = newChannelRequest;\nexports.watchNewChannelRequest = watchNewChannelRequest;\nexports.watchUpdateChannelClaims = watchUpdateChannelClaims;\n\nvar _effects = __webpack_require__(15);\n\nvar _show_action_types = __webpack_require__(12);\n\nvar actions = _interopRequireWildcard(_show_action_types);\n\nvar _show = __webpack_require__(8);\n\nvar _channelApi = __webpack_require__(146);\n\nvar _show2 = __webpack_require__(13);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nvar _marked = /*#__PURE__*/regeneratorRuntime.mark(newChannelRequest),\n _marked2 = /*#__PURE__*/regeneratorRuntime.mark(watchNewChannelRequest),\n _marked3 = /*#__PURE__*/regeneratorRuntime.mark(getNewClaimsAndUpdateChannel),\n _marked4 = /*#__PURE__*/regeneratorRuntime.mark(watchUpdateChannelClaims);\n\nfunction newChannelRequest(action) {\n var _action$data, requestType, requestId, channelName, channelId, state, longId, shortId, _ref, _ref$data, channelKey, claimsData, _ref2;\n\n return regeneratorRuntime.wrap(function newChannelRequest$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n _action$data = action.data, requestType = _action$data.requestType, requestId = _action$data.requestId, channelName = _action$data.channelName, channelId = _action$data.channelId;\n // put an action to update the request in redux\n\n _context.next = 3;\n return (0, _effects.put)((0, _show.onRequestUpdate)(requestType, requestId));\n\n case 3:\n _context.next = 5;\n return (0, _effects.select)(_show2.selectShowState);\n\n case 5:\n state = _context.sent;\n\n if (!state.requestList[requestId]) {\n _context.next = 8;\n break;\n }\n\n return _context.abrupt('return', null);\n\n case 8:\n // get channel long id\n longId = void 0, shortId = void 0;\n _context.prev = 9;\n _context.next = 12;\n return (0, _effects.call)(_channelApi.getChannelData, channelName, channelId);\n\n case 12:\n _ref = _context.sent;\n _ref$data = _ref.data;\n longId = _ref$data.longChannelClaimId;\n shortId = _ref$data.shortChannelClaimId;\n _context.next = 23;\n break;\n\n case 18:\n _context.prev = 18;\n _context.t0 = _context['catch'](9);\n _context.next = 22;\n return (0, _effects.put)((0, _show.onRequestError)(_context.t0.message));\n\n case 22:\n return _context.abrupt('return', _context.sent);\n\n case 23:\n // store the request in the channel requests list\n channelKey = 'c#' + channelName + '#' + longId;\n _context.next = 26;\n return (0, _effects.put)((0, _show.addRequestToRequestList)(requestId, null, channelKey));\n\n case 26:\n if (!state.channelList[channelKey]) {\n _context.next = 28;\n break;\n }\n\n return _context.abrupt('return', null);\n\n case 28:\n // get channel claims data\n claimsData = void 0;\n _context.prev = 29;\n _context.next = 32;\n return (0, _effects.call)(_channelApi.getChannelClaims, channelName, longId, 1);\n\n case 32:\n _ref2 = _context.sent;\n claimsData = _ref2.data;\n _context.next = 41;\n break;\n\n case 36:\n _context.prev = 36;\n _context.t1 = _context['catch'](29);\n _context.next = 40;\n return (0, _effects.put)((0, _show.onRequestError)(_context.t1.message));\n\n case 40:\n return _context.abrupt('return', _context.sent);\n\n case 41:\n _context.next = 43;\n return (0, _effects.put)((0, _show.addNewChannelToChannelList)(channelKey, channelName, shortId, longId, claimsData));\n\n case 43:\n _context.next = 45;\n return (0, _effects.put)((0, _show.onRequestError)(null));\n\n case 45:\n case 'end':\n return _context.stop();\n }\n }\n }, _marked, this, [[9, 18], [29, 36]]);\n}\n\nfunction watchNewChannelRequest() {\n return regeneratorRuntime.wrap(function watchNewChannelRequest$(_context2) {\n while (1) {\n switch (_context2.prev = _context2.next) {\n case 0:\n _context2.next = 2;\n return (0, _effects.takeLatest)(actions.CHANNEL_REQUEST_NEW, newChannelRequest);\n\n case 2:\n case 'end':\n return _context2.stop();\n }\n }\n }, _marked2, this);\n};\n\nfunction getNewClaimsAndUpdateChannel(action) {\n var _action$data2, channelKey, name, longId, page, claimsData, _ref3;\n\n return regeneratorRuntime.wrap(function getNewClaimsAndUpdateChannel$(_context3) {\n while (1) {\n switch (_context3.prev = _context3.next) {\n case 0:\n _action$data2 = action.data, channelKey = _action$data2.channelKey, name = _action$data2.name, longId = _action$data2.longId, page = _action$data2.page;\n claimsData = void 0;\n _context3.prev = 2;\n _context3.next = 5;\n return (0, _effects.call)(_channelApi.getChannelClaims, name, longId, page);\n\n case 5:\n _ref3 = _context3.sent;\n claimsData = _ref3.data;\n _context3.next = 14;\n break;\n\n case 9:\n _context3.prev = 9;\n _context3.t0 = _context3['catch'](2);\n _context3.next = 13;\n return (0, _effects.put)((0, _show.onRequestError)(_context3.t0.message));\n\n case 13:\n return _context3.abrupt('return', _context3.sent);\n\n case 14:\n _context3.next = 16;\n return (0, _effects.put)((0, _show.updateChannelClaims)(channelKey, claimsData));\n\n case 16:\n case 'end':\n return _context3.stop();\n }\n }\n }, _marked3, this, [[2, 9]]);\n}\n\nfunction watchUpdateChannelClaims() {\n return regeneratorRuntime.wrap(function watchUpdateChannelClaims$(_context4) {\n while (1) {\n switch (_context4.prev = _context4.next) {\n case 0:\n _context4.next = 2;\n return (0, _effects.takeLatest)(actions.CHANNEL_CLAIMS_UPDATE_ASYNC, getNewClaimsAndUpdateChannel);\n\n case 2:\n case 'end':\n return _context4.stop();\n }\n }\n }, _marked4, this);\n}\n\n/***/ }),\n/* 146 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.getChannelData = getChannelData;\nexports.getChannelClaims = getChannelClaims;\n\nvar _request = __webpack_require__(11);\n\nvar _request2 = _interopRequireDefault(_request);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar _require = __webpack_require__(3),\n host = _require.site.host;\n\nfunction getChannelData(name, id) {\n if (!id) id = 'none';\n var url = host + '/api/channel/data/' + name + '/' + id;\n return (0, _request2.default)(url);\n};\n\nfunction getChannelClaims(name, longId, page) {\n if (!page) page = 1;\n var url = host + '/api/channel/claims/' + name + '/' + longId + '/' + page;\n return (0, _request2.default)(url);\n};\n\n/***/ }),\n/* 147 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nmodule.exports = {\n REGEXP_INVALID_CLAIM: /[^A-Za-z0-9-]/g,\n REGEXP_INVALID_CHANNEL: /[^A-Za-z0-9-@]/g,\n REGEXP_ADDRESS: /^b(?=[^0OIl]{32,33})[0-9A-Za-z]{32,33}$/,\n CHANNEL_CHAR: '@',\n parseIdentifier: function parseIdentifier(identifier) {\n var componentsRegex = new RegExp('([^:$#/]*)' + // value (stops at the first separator or end)\n '([:$#]?)([^/]*)' // modifier separator, modifier (stops at the first path separator or end)\n );\n\n var _componentsRegex$exec = componentsRegex // eslint-disable-line no-unused-vars\n .exec(identifier).map(function (match) {\n return match || null;\n }),\n _componentsRegex$exec2 = _slicedToArray(_componentsRegex$exec, 4),\n proto = _componentsRegex$exec2[0],\n value = _componentsRegex$exec2[1],\n modifierSeperator = _componentsRegex$exec2[2],\n modifier = _componentsRegex$exec2[3];\n\n // Validate and process name\n\n\n if (!value) {\n throw new Error('Check your URL. No channel name provided before \"' + modifierSeperator + '\"');\n }\n var isChannel = value.startsWith(module.exports.CHANNEL_CHAR);\n var channelName = isChannel ? value : null;\n var claimId = void 0;\n if (isChannel) {\n if (!channelName) {\n throw new Error('Check your URL. No channel name after \"@\".');\n }\n var nameBadChars = channelName.match(module.exports.REGEXP_INVALID_CHANNEL);\n if (nameBadChars) {\n throw new Error('Check your URL. Invalid characters in channel name: \"' + nameBadChars.join(', ') + '\".');\n }\n } else {\n claimId = value;\n }\n\n // Validate and process modifier\n var channelClaimId = void 0;\n if (modifierSeperator) {\n if (!modifier) {\n throw new Error('Check your URL. No modifier provided after separator \"' + modifierSeperator + '\"');\n }\n\n if (modifierSeperator === ':') {\n channelClaimId = modifier;\n } else {\n throw new Error('Check your URL. The \"' + modifierSeperator + '\" modifier is not currently supported');\n }\n }\n return {\n isChannel: isChannel,\n channelName: channelName,\n channelClaimId: channelClaimId || null,\n claimId: claimId || null\n };\n },\n parseClaim: function parseClaim(name) {\n var componentsRegex = new RegExp('([^:$#/.]*)' + // name (stops at the first extension)\n '([:$#.]?)([^/]*)' // extension separator, extension (stops at the first path separator or end)\n );\n\n var _componentsRegex$exec3 = componentsRegex // eslint-disable-line no-unused-vars\n .exec(name).map(function (match) {\n return match || null;\n }),\n _componentsRegex$exec4 = _slicedToArray(_componentsRegex$exec3, 4),\n proto = _componentsRegex$exec4[0],\n claimName = _componentsRegex$exec4[1],\n extensionSeperator = _componentsRegex$exec4[2],\n extension = _componentsRegex$exec4[3];\n\n // Validate and process name\n\n\n if (!claimName) {\n throw new Error('Check your URL. No claim name provided before \".\"');\n }\n var nameBadChars = claimName.match(module.exports.REGEXP_INVALID_CLAIM);\n if (nameBadChars) {\n throw new Error('Check your URL. Invalid characters in claim name: \"' + nameBadChars.join(', ') + '\".');\n }\n // Validate and process extension\n if (extensionSeperator) {\n if (!extension) {\n throw new Error('Check your URL. No file extension provided after separator \"' + extensionSeperator + '\".');\n }\n if (extensionSeperator !== '.') {\n throw new Error('Check your URL. The \"' + extensionSeperator + '\" separator is not supported in the claim name.');\n }\n }\n return {\n claimName: claimName,\n extension: extension || null\n };\n }\n};\n\n/***/ }),\n/* 148 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar handlePageRender = __webpack_require__(28);\n\nmodule.exports = function (app) {\n // a catch-all route if someone visits a page that does not exist\n app.use('*', function (req, res) {\n // send response\n handlePageRender(req, res);\n });\n};\n\n/***/ }),\n/* 149 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"http\");\n\n/***/ })\n/******/ ]);\n\n\n// WEBPACK FOOTER //\n// index.js"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 43);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 47ef8a56670ef614a652","module.exports = require(\"react\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"react\"\n// module id = 0\n// module chunks = 0","module.exports = require(\"react-redux\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"react-redux\"\n// module id = 1\n// module chunks = 0","module.exports = require(\"winston\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"winston\"\n// module id = 2\n// module chunks = 0","module.exports = {\n analytics: {\n googleId: 'UA-60403362-6', // google id for analytics tracking; leave `null` if not applicable\n },\n logging: {\n logLevel : 'debug', // options: silly, debug, verbose, info\n slackWebHook : 'https://hooks.slack.com/services/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', // enter a webhook if you wish to push logs to slack; otherwise leave as `null`\n slackErrorChannel: null, // enter a slack channel (#example) for errors to be sent to; otherwise leave null\n slackInfoChannel : '#speech-dev1-errors', // enter a slack channel (#info) for info level logs to be sent to otherwise leave null\n },\n session: {\n sessionKey: 'nans$#kfjanwe234rydns', // enter a secret key to be used for session encryption\n },\n files: {\n uploadDirectory: '/home/lbry/Uploads', // enter file path to where uploads/publishes should be stored\n },\n site: {\n title : 'dev1.Spee.ch',\n name : 'dev1.Spee.ch',\n host : 'https://dev1.spee.ch',\n description: 'Open-source, decentralized image and video sharing.',\n },\n publish: {\n primaryClaimAddress : 'bDZ2wPwtULUGxT7GXuNLpQhXmdPRUTUkcL',\n additionalClaimAddresses: ['banpwixPosfVDWnGvXqU2af36Qpsd7buGd'],\n thumbnailChannel : '@dev1thumbs', // create a channel to use for thumbnail images\n thumbnailChannelId : 'aeb625ff6f66c3eeeb42885070f4e53876033626', // the channel_id (claim id) for the channel above\n },\n claim: {\n defaultTitle : 'dev1 Spee.ch',\n defaultThumbnail : 'https://spee.ch/assets/img/video_thumb_default.png',\n defaultDescription: 'Open-source, decentralized image and video sharing.',\n },\n testing: {\n testChannel : '@test', // a channel to make test publishes in\n testChannelId : '3b5bc6b6819172c6e2f3f90aa855b14a956b4a82', // the claim id for the test channel\n testChannelPassword: '1234', // password for the test channel\n },\n api: {\n apiHost: 'localhost',\n apiPort: '5279',\n },\n};\n\n\n\n// WEBPACK FOOTER //\n// ./config/speechConfig.js","module.exports = require(\"react-router-dom\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"react-router-dom\"\n// module id = 4\n// module chunks = 0","import * as actions from 'constants/publish_action_types';\n\n// export action creators\nexport function selectFile (file) {\n return {\n type: actions.FILE_SELECTED,\n data: file,\n };\n};\n\nexport function clearFile () {\n return {\n type: actions.FILE_CLEAR,\n };\n};\n\nexport function updateMetadata (name, value) {\n return {\n type: actions.METADATA_UPDATE,\n data: {\n name,\n value,\n },\n };\n};\n\nexport function updateClaim (value) {\n return {\n type: actions.CLAIM_UPDATE,\n data: value,\n };\n};\n\nexport function setPublishInChannel (channel) {\n return {\n type: actions.SET_PUBLISH_IN_CHANNEL,\n channel,\n };\n};\n\nexport function updatePublishStatus (status, message) {\n return {\n type: actions.PUBLISH_STATUS_UPDATE,\n data: {\n status,\n message,\n },\n };\n};\n\nexport function updateError (name, value) {\n return {\n type: actions.ERROR_UPDATE,\n data: {\n name,\n value,\n },\n };\n};\n\nexport function updateSelectedChannel (channelName) {\n return {\n type: actions.SELECTED_CHANNEL_UPDATE,\n data: channelName,\n };\n};\n\nexport function toggleMetadataInputs (showMetadataInputs) {\n return {\n type: actions.TOGGLE_METADATA_INPUTS,\n data: showMetadataInputs,\n };\n};\n\nexport function onNewThumbnail (file) {\n return {\n type: actions.THUMBNAIL_NEW,\n data: file,\n };\n};\n\nexport function startPublish (history) {\n return {\n type: actions.PUBLISH_START,\n data: { history },\n };\n}\n\n\n\n// WEBPACK FOOTER //\n// ./react/actions/publish.js","const Sequelize = require('sequelize');\nconst logger = require('winston');\n\nmodule.exports = (mysqlConfig) => {\n const { database, username, password } = mysqlConfig;\n const db = {};\n // set sequelize options\n const sequelize = new Sequelize(database, username, password, {\n host : 'localhost',\n dialect : 'mysql',\n dialectOptions: {decimalNumbers: true}, // fix to ensure DECIMAL will not be stored as a string\n logging : false,\n pool : {\n max : 5,\n min : 0,\n idle : 10000,\n acquire: 10000,\n },\n });\n\n // establish mysql connection\n sequelize\n .authenticate()\n .then(() => {\n logger.info('Sequelize has established mysql connection successfully.');\n })\n .catch(err => {\n logger.error('Sequelize was unable to connect to the database:', err);\n });\n\n // manually add each model to the db object\n const Certificate = require('./certificate.js');\n const Channel = require('./channel.js');\n const Claim = require('./claim.js');\n const File = require('./file.js');\n const Request = require('./request.js');\n const User = require('./user.js');\n db['Certificate'] = sequelize.import('Certificate', Certificate);\n db['Channel'] = sequelize.import('Channel', Channel);\n db['Claim'] = sequelize.import('Claim', Claim);\n db['File'] = sequelize.import('File', File);\n db['Request'] = sequelize.import('Request', Request);\n db['User'] = sequelize.import('User', User);\n\n // run model.association for each model in the db object that has an association\n Object.keys(db).forEach(modelName => {\n if (db[modelName].associate) {\n logger.info('Associating model:', modelName);\n db[modelName].associate(db);\n }\n });\n\n db.sequelize = sequelize;\n db.Sequelize = Sequelize;\n\n // add an 'upsert' method to the db object\n db.upsert = (Model, values, condition, tableName) => {\n return Model\n .findOne({\n where: condition,\n })\n .then(obj => {\n if (obj) { // update\n logger.debug(`updating record in db.${tableName}`);\n return obj.update(values);\n } else { // insert\n logger.debug(`creating record in db.${tableName}`);\n return Model.create(values);\n }\n })\n .catch(function (error) {\n logger.error(`${tableName}.upsert error`, error);\n throw error;\n });\n };\n\n return db;\n};\n\n\n\n// WEBPACK FOOTER //\n// ./models/index.js","import { connect } from 'react-redux';\nimport { updateLoggedInChannel } from 'actions/channel';\nimport View from './view';\nimport {updateSelectedChannel} from '../../actions/publish';\n\nconst mapStateToProps = ({ channel }) => {\n return {\n channelName : channel.loggedInChannel.name,\n channelShortId: channel.loggedInChannel.shortId,\n channelLongId : channel.loggedInChannel.longId,\n };\n};\n\nconst mapDispatchToProps = dispatch => {\n return {\n onChannelLogin: (name, shortId, longId) => {\n dispatch(updateLoggedInChannel(name, shortId, longId));\n dispatch(updateSelectedChannel(name));\n },\n onChannelLogout: () => {\n dispatch(updateLoggedInChannel(null, null, null));\n },\n };\n};\n\nexport default connect(mapStateToProps, mapDispatchToProps)(View);\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/NavBar/index.js","import * as actions from 'constants/show_action_types';\n\nimport { CHANNEL, ASSET_LITE, ASSET_DETAILS } from 'constants/show_request_types';\n\n// basic request parsing\nexport function onHandleShowPageUri (params) {\n return {\n type: actions.HANDLE_SHOW_URI,\n data: params,\n };\n};\n\nexport function onRequestError (error) {\n return {\n type: actions.REQUEST_ERROR,\n data: error,\n };\n};\n\nexport function onNewChannelRequest (channelName, channelId) {\n const requestType = CHANNEL;\n const requestId = `cr#${channelName}#${channelId}`;\n return {\n type: actions.CHANNEL_REQUEST_NEW,\n data: { requestType, requestId, channelName, channelId },\n };\n};\n\nexport function onNewAssetRequest (name, id, channelName, channelId, extension) {\n const requestType = extension ? ASSET_LITE : ASSET_DETAILS;\n const requestId = `ar#${name}#${id}#${channelName}#${channelId}`;\n return {\n type: actions.ASSET_REQUEST_NEW,\n data: {\n requestType,\n requestId,\n name,\n modifier: {\n id,\n channel: {\n name: channelName,\n id : channelId,\n },\n },\n },\n };\n};\n\nexport function onRequestUpdate (requestType, requestId) {\n return {\n type: actions.REQUEST_UPDATE,\n data: {\n requestType,\n requestId,\n },\n };\n};\n\nexport function addRequestToRequestList (id, error, key) {\n return {\n type: actions.REQUEST_LIST_ADD,\n data: { id, error, key },\n };\n};\n\n// asset actions\n\nexport function addAssetToAssetList (id, error, name, claimId, shortId, claimData) {\n return {\n type: actions.ASSET_ADD,\n data: { id, error, name, claimId, shortId, claimData },\n };\n}\n\n// channel actions\n\nexport function addNewChannelToChannelList (id, name, shortId, longId, claimsData) {\n return {\n type: actions.CHANNEL_ADD,\n data: { id, name, shortId, longId, claimsData },\n };\n};\n\nexport function onUpdateChannelClaims (channelKey, name, longId, page) {\n return {\n type: actions.CHANNEL_CLAIMS_UPDATE_ASYNC,\n data: {channelKey, name, longId, page},\n };\n};\n\nexport function updateChannelClaims (channelListId, claimsData) {\n return {\n type: actions.CHANNEL_CLAIMS_UPDATE_SUCCESS,\n data: {channelListId, claimsData},\n };\n};\n\n// display a file\n\nexport function fileRequested (name, claimId) {\n return {\n type: actions.FILE_REQUESTED,\n data: { name, claimId },\n };\n};\n\nexport function updateFileAvailability (status) {\n return {\n type: actions.FILE_AVAILABILITY_UPDATE,\n data: status,\n };\n};\n\nexport function updateDisplayAssetError (error) {\n return {\n type: actions.DISPLAY_ASSET_ERROR,\n data: error,\n };\n};\n\n\n\n// WEBPACK FOOTER //\n// ./react/actions/show.js","import React from 'react';\nimport Helmet from 'react-helmet';\nimport PropTypes from 'prop-types';\n\nimport { createPageTitle } from 'utils/pageTitle';\nimport { createMetaTags } from 'utils/metaTags';\nimport { createCanonicalLink } from 'utils/canonicalLink';\n\nclass SEO extends React.Component {\n render () {\n let { pageTitle, asset, channel, pageUri } = this.props;\n pageTitle = createPageTitle(pageTitle);\n const metaTags = createMetaTags(asset, channel);\n const canonicalLink = createCanonicalLink(asset, channel, pageUri);\n return (\n \n );\n }\n};\n\nSEO.propTypes = {\n pageTitle: PropTypes.string,\n pageUri : PropTypes.string,\n channel : PropTypes.object,\n asset : PropTypes.object,\n};\n\nexport default SEO;\n\n\n\n// WEBPACK FOOTER //\n// ./react/components/SEO/index.jsx","module.exports = require(\"prop-types\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"prop-types\"\n// module id = 10\n// module chunks = 0","import 'cross-fetch/polyfill';\n\n/**\n * Parses the JSON returned by a network request\n *\n * @param {object} response A response from a network request\n *\n * @return {object} The parsed JSON from the request\n */\nfunction parseJSON (response) {\n if (response.status === 204 || response.status === 205) {\n return null;\n }\n return response.json();\n}\n\n/**\n * Parses the status returned by a network request\n *\n * @param {object} response A response from a network request\n * @param {object} response The parsed JSON from the network request\n *\n * @return {object | undefined} Returns object with status and statusText, or undefined\n */\nfunction checkStatus (response, jsonResponse) {\n if (response.status >= 200 && response.status < 300) {\n return jsonResponse;\n }\n const error = new Error(jsonResponse.message);\n error.response = response;\n throw error;\n}\n\n/**\n * Requests a URL, returning a promise\n *\n * @param {string} url The URL we want to request\n * @param {object} [options] The options we want to pass to \"fetch\"\n *\n * @return {object} The response data\n */\n\nexport default function request (url, options) {\n return fetch(url, options)\n .then(response => {\n return Promise.all([response, parseJSON(response)]);\n })\n .then(([response, jsonResponse]) => {\n return checkStatus(response, jsonResponse);\n });\n}\n\n\n\n// WEBPACK FOOTER //\n// ./react/utils/request.js","// request actions\nexport const HANDLE_SHOW_URI = 'HANDLE_SHOW_URI';\nexport const REQUEST_ERROR = 'REQUEST_ERROR';\nexport const REQUEST_UPDATE = 'REQUEST_UPDATE';\nexport const ASSET_REQUEST_NEW = 'ASSET_REQUEST_NEW';\nexport const CHANNEL_REQUEST_NEW = 'CHANNEL_REQUEST_NEW';\nexport const REQUEST_LIST_ADD = 'REQUEST_LIST_ADD';\n\n// asset actions\nexport const ASSET_ADD = `ASSET_ADD`;\n\n// channel actions\nexport const CHANNEL_ADD = 'CHANNEL_ADD';\n\nexport const CHANNEL_CLAIMS_UPDATE_ASYNC = 'CHANNEL_CLAIMS_UPDATE_ASYNC';\nexport const CHANNEL_CLAIMS_UPDATE_SUCCESS = 'CHANNEL_CLAIMS_UPDATE_SUCCESS';\n\n// asset/file display actions\nexport const FILE_REQUESTED = 'FILE_REQUESTED';\nexport const FILE_AVAILABILITY_UPDATE = 'FILE_AVAILABILITY_UPDATE';\nexport const DISPLAY_ASSET_ERROR = 'DISPLAY_ASSET_ERROR';\n\n\n\n// WEBPACK FOOTER //\n// ./react/constants/show_action_types.js","export const selectAsset = (show) => {\n const request = show.requestList[show.request.id];\n const assetKey = request.key;\n return show.assetList[assetKey];\n};\n\nexport const selectShowState = (state) => {\n return state.show;\n};\n\n\n\n// WEBPACK FOOTER //\n// ./react/selectors/show.js","module.exports = require(\"react-helmet\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"react-helmet\"\n// module id = 14\n// module chunks = 0","module.exports = require(\"redux-saga/effects\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"redux-saga/effects\"\n// module id = 15\n// module chunks = 0","const axios = require('axios');\nconst logger = require('winston');\nconst config = require('../config/speechConfig.js');\nconst { apiHost, apiPort } = config.api;\nconst lbryApiUri = 'http://' + apiHost + ':' + apiPort;\nconst { chooseGaLbrynetPublishLabel, sendGATimingEvent } = require('./googleAnalytics.js');\n\nconst handleLbrynetResponse = ({ data }, resolve, reject) => {\n logger.debug('lbry api data:', data);\n if (data.result) {\n // check for an error\n if (data.result.error) {\n logger.debug('Lbrynet api error:', data.result.error);\n reject(new Error(data.result.error));\n return;\n };\n resolve(data.result);\n return;\n }\n // fallback in case it just timed out\n reject(JSON.stringify(data));\n};\n\nmodule.exports = {\n publishClaim (publishParams) {\n logger.debug(`lbryApi >> Publishing claim to \"${publishParams.name}\"`);\n const gaStartTime = Date.now();\n return new Promise((resolve, reject) => {\n axios\n .post(lbryApiUri, {\n method: 'publish',\n params: publishParams,\n })\n .then(response => {\n sendGATimingEvent('lbrynet', 'publish', chooseGaLbrynetPublishLabel(publishParams), gaStartTime, Date.now());\n handleLbrynetResponse(response, resolve, reject);\n })\n .catch(error => {\n reject(error);\n });\n });\n },\n getClaim (uri) {\n logger.debug(`lbryApi >> Getting Claim for \"${uri}\"`);\n const gaStartTime = Date.now();\n return new Promise((resolve, reject) => {\n axios\n .post(lbryApiUri, {\n method: 'get',\n params: { uri, timeout: 20 },\n })\n .then(response => {\n sendGATimingEvent('lbrynet', 'getClaim', 'GET', gaStartTime, Date.now());\n handleLbrynetResponse(response, resolve, reject);\n })\n .catch(error => {\n reject(error);\n });\n });\n },\n getClaimList (claimName) {\n logger.debug(`lbryApi >> Getting claim_list for \"${claimName}\"`);\n const gaStartTime = Date.now();\n return new Promise((resolve, reject) => {\n axios\n .post(lbryApiUri, {\n method: 'claim_list',\n params: { name: claimName },\n })\n .then(response => {\n sendGATimingEvent('lbrynet', 'getClaimList', 'CLAIM_LIST', gaStartTime, Date.now());\n handleLbrynetResponse(response, resolve, reject);\n })\n .catch(error => {\n reject(error);\n });\n });\n },\n resolveUri (uri) {\n logger.debug(`lbryApi >> Resolving URI for \"${uri}\"`);\n const gaStartTime = Date.now();\n return new Promise((resolve, reject) => {\n axios\n .post(lbryApiUri, {\n method: 'resolve',\n params: { uri },\n })\n .then(({ data }) => {\n sendGATimingEvent('lbrynet', 'resolveUri', 'RESOLVE', gaStartTime, Date.now());\n if (data.result[uri].error) { // check for errors\n reject(data.result[uri].error);\n } else { // if no errors, resolve\n resolve(data.result[uri]);\n }\n })\n .catch(error => {\n reject(error);\n });\n });\n },\n getDownloadDirectory () {\n logger.debug('lbryApi >> Retrieving the download directory path from lbry daemon...');\n const gaStartTime = Date.now();\n return new Promise((resolve, reject) => {\n axios\n .post(lbryApiUri, {\n method: 'settings_get',\n })\n .then(({ data }) => {\n sendGATimingEvent('lbrynet', 'getDownloadDirectory', 'SETTINGS_GET', gaStartTime, Date.now());\n if (data.result) {\n resolve(data.result.download_directory);\n } else {\n return new Error('Successfully connected to lbry daemon, but unable to retrieve the download directory.');\n }\n })\n .catch(error => {\n logger.error('Lbrynet Error:', error);\n resolve('/home/lbry/Downloads/');\n });\n });\n },\n createChannel (name) {\n logger.debug(`lbryApi >> Creating channel for ${name}...`);\n const gaStartTime = Date.now();\n return new Promise((resolve, reject) => {\n axios\n .post(lbryApiUri, {\n method: 'channel_new',\n params: {\n channel_name: name,\n amount : 0.1,\n },\n })\n .then(response => {\n sendGATimingEvent('lbrynet', 'createChannel', 'CHANNEL_NEW', gaStartTime, Date.now());\n handleLbrynetResponse(response, resolve, reject);\n })\n .catch(error => {\n reject(error);\n });\n });\n },\n};\n\n\n\n// WEBPACK FOOTER //\n// ./helpers/lbryApi.js","const logger = require('winston');\nconst ua = require('universal-analytics');\nconst { analytics : { googleId }, site: { name: siteName } } = require('../config/speechConfig.js');\n\nfunction createServeEventParams (headers, ip, originalUrl) {\n return {\n eventCategory : 'client requests',\n eventAction : 'serve request',\n eventLabel : originalUrl,\n ipOverride : ip,\n userAgentOverride: headers['user-agent'],\n };\n};\n\nfunction createPublishTimingEventParams (category, variable, label, startTime, endTime) {\n const duration = endTime - startTime;\n return {\n userTimingCategory : category,\n userTimingVariableName: variable,\n userTimingTime : duration,\n userTimingLabel : label,\n };\n};\n\nfunction sendGoogleAnalyticsEvent (ip, params) {\n const visitorId = ip.replace(/\\./g, '-');\n const visitor = ua(googleId, visitorId, { strictCidFormat: false, https: true });\n visitor.event(params, (err) => {\n if (err) {\n logger.error('Google Analytics Event Error >>', err);\n }\n });\n};\n\nfunction sendGoogleAnalyticsTiming (visitorId, params) {\n const visitor = ua(googleId, visitorId, { strictCidFormat: false, https: true });\n visitor.timing(params, (err) => {\n if (err) {\n logger.error('Google Analytics Event Error >>', err);\n }\n logger.debug(`Timing event successfully sent to google analytics`);\n });\n};\n\nmodule.exports = {\n sendGAServeEvent (headers, ip, originalUrl) {\n const params = createServeEventParams(headers, ip, originalUrl);\n sendGoogleAnalyticsEvent(ip, params);\n },\n sendGATimingEvent (category, variable, label, startTime, endTime) {\n const params = createPublishTimingEventParams(category, variable, label, startTime, endTime);\n sendGoogleAnalyticsTiming(siteName, params);\n },\n chooseGaLbrynetPublishLabel ({ channel_name: channelName, channel_id: channelId }) {\n return (channelName || channelId ? 'PUBLISH_IN_CHANNEL_CLAIM' : 'PUBLISH_ANONYMOUS_CLAIM');\n },\n};\n\n\n\n// WEBPACK FOOTER //\n// ./helpers/googleAnalytics.js","module.exports = require(\"redux\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"redux\"\n// module id = 18\n// module chunks = 0","import * as actions from 'constants/channel_action_types';\n\n// export action creators\n\nexport function updateLoggedInChannel (name, shortId, longId) {\n return {\n type: actions.CHANNEL_UPDATE,\n data: {\n name,\n shortId,\n longId,\n },\n };\n};\n\n\n\n// WEBPACK FOOTER //\n// ./react/actions/channel.js","import React from 'react';\nimport PropTypes from 'prop-types';\nimport ActiveStatusBar from 'components/ActiveStatusBar';\nimport InactiveStatusBar from 'components/InactiveStatusBar';\n\nclass ProgressBar extends React.Component {\n constructor (props) {\n super(props);\n this.state = {\n bars : [],\n index : 0,\n incrementer: 1,\n };\n this.createBars = this.createBars.bind(this);\n this.startProgressBar = this.startProgressBar.bind(this);\n this.updateProgressBar = this.updateProgressBar.bind(this);\n this.stopProgressBar = this.stopProgressBar.bind(this);\n }\n componentDidMount () {\n this.createBars();\n this.startProgressBar();\n }\n componentWillUnmount () {\n this.stopProgressBar();\n }\n createBars () {\n const bars = [];\n for (let i = 0; i <= this.props.size; i++) {\n bars.push({isActive: false});\n }\n this.setState({ bars });\n }\n startProgressBar () {\n this.updateInterval = setInterval(this.updateProgressBar.bind(this), 300);\n };\n updateProgressBar () {\n let index = this.state.index;\n let incrementer = this.state.incrementer;\n let bars = this.state.bars;\n // flip incrementer if necessary, to stay in bounds\n if ((index < 0) || (index > this.props.size)) {\n incrementer = incrementer * -1;\n index += incrementer;\n }\n // update the indexed bar\n if (incrementer > 0) {\n bars[index].isActive = true;\n } else {\n bars[index].isActive = false;\n };\n // increment index\n index += incrementer;\n // update state\n this.setState({\n bars,\n incrementer,\n index,\n });\n };\n stopProgressBar () {\n clearInterval(this.updateInterval);\n };\n render () {\n return (\n
\n {this.state.bars.map((bar, index) => bar.isActive ? : )}\n
\n );\n }\n};\n\nProgressBar.propTypes = {\n size: PropTypes.number.isRequired,\n};\n\nexport default ProgressBar;\n\n\n\n// WEBPACK FOOTER //\n// ./react/components/ProgressBar/index.jsx","import React from 'react';\nimport PropTypes from 'prop-types';\nimport NavBar from 'containers/NavBar';\n\nclass ErrorPage extends React.Component {\n render () {\n const { error } = this.props;\n return (\n
\n \n
\n

{error}

\n
\n
\n );\n }\n};\n\nErrorPage.propTypes = {\n error: PropTypes.string.isRequired,\n};\n\nexport default ErrorPage;\n\n\n\n// WEBPACK FOOTER //\n// ./react/components/ErrorPage/index.jsx","module.exports = require(\"passport\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"passport\"\n// module id = 22\n// module chunks = 0","module.exports = {\n returnShortId: function (claimsArray, longId) {\n let claimIndex;\n let shortId = longId.substring(0, 1); // default short id is the first letter\n let shortIdLength = 0;\n // find the index of this claim id\n claimIndex = claimsArray.findIndex(element => {\n return element.claimId === longId;\n });\n if (claimIndex < 0) {\n throw new Error('claim id not found in claims list');\n }\n // get an array of all claims with lower height\n let possibleMatches = claimsArray.slice(0, claimIndex);\n // remove certificates with the same prefixes until none are left.\n while (possibleMatches.length > 0) {\n shortIdLength += 1;\n shortId = longId.substring(0, shortIdLength);\n possibleMatches = possibleMatches.filter(element => {\n return (element.claimId && (element.claimId.substring(0, shortIdLength) === shortId));\n });\n }\n return shortId;\n },\n};\n\n\n\n// WEBPACK FOOTER //\n// ./helpers/sequelizeHelpers.js","module.exports = require(\"passport-local\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"passport-local\"\n// module id = 24\n// module chunks = 0","const logger = require('winston');\nconst fs = require('fs');\nconst { site, wallet, publish } = require('../config/speechConfig.js');\n\nmodule.exports = {\n parsePublishApiRequestBody ({name, nsfw, license, title, description, thumbnail}) {\n // validate name\n if (!name) {\n throw new Error('no name field found in request');\n }\n const invalidNameCharacters = /[^A-Za-z0-9,-]/.exec(name);\n if (invalidNameCharacters) {\n throw new Error('The claim name you provided is not allowed. Only the following characters are allowed: A-Z, a-z, 0-9, and \"-\"');\n }\n // optional parameters\n nsfw = (nsfw === 'true');\n license = license || null;\n title = title || null;\n description = description || null;\n thumbnail = thumbnail || null;\n // return results\n return {\n name,\n nsfw,\n license,\n title,\n description,\n thumbnail,\n };\n },\n parsePublishApiRequestFiles ({file, thumbnail}) {\n // make sure a file was provided\n if (!file) {\n throw new Error('no file with key of [file] found in request');\n }\n if (!file.path) {\n throw new Error('no file path found');\n }\n if (!file.type) {\n throw new Error('no file type found');\n }\n if (!file.size) {\n throw new Error('no file type found');\n }\n // validate the file name\n if (/'/.test(file.name)) {\n throw new Error('apostrophes are not allowed in the file name');\n }\n // validate the file\n module.exports.validateFileTypeAndSize(file);\n // return results\n return {\n fileName : file.name,\n filePath : file.path,\n fileType : file.type,\n thumbnailFileName: (thumbnail ? thumbnail.name : null),\n thumbnailFilePath: (thumbnail ? thumbnail.path : null),\n thumbnailFileType: (thumbnail ? thumbnail.type : null),\n };\n },\n validateFileTypeAndSize (file) {\n // check file type and size\n switch (file.type) {\n case 'image/jpeg':\n case 'image/jpg':\n case 'image/png':\n if (file.size > 10000000) {\n logger.debug('publish > file validation > .jpeg/.jpg/.png was too big');\n throw new Error('Sorry, images are limited to 10 megabytes.');\n }\n break;\n case 'image/gif':\n if (file.size > 50000000) {\n logger.debug('publish > file validation > .gif was too big');\n throw new Error('Sorry, .gifs are limited to 50 megabytes.');\n }\n break;\n case 'video/mp4':\n if (file.size > 50000000) {\n logger.debug('publish > file validation > .mp4 was too big');\n throw new Error('Sorry, videos are limited to 50 megabytes.');\n }\n break;\n default:\n logger.debug('publish > file validation > unrecognized file type');\n throw new Error('The ' + file.type + ' content type is not supported. Only, .jpeg, .png, .gif, and .mp4 files are currently supported.');\n }\n return file;\n },\n createBasicPublishParams (filePath, name, title, description, license, nsfw, thumbnail) {\n logger.debug(`Creating Publish Parameters`);\n // provide defaults for title\n if (title === null || title.trim() === '') {\n title = name;\n }\n // provide default for description\n if (description === null || description.trim() === '') {\n description = '';\n }\n // provide default for license\n if (license === null || license.trim() === '') {\n license = ' '; // default to empty string\n }\n // create the publish params\n const publishParams = {\n name,\n file_path: filePath,\n bid : 0.01,\n metadata : {\n description,\n title,\n author : site.title,\n language: 'en',\n license,\n nsfw,\n },\n claim_address: wallet.lbryClaimAddress,\n };\n // add thumbnail to channel if video\n if (thumbnail) {\n publishParams['metadata']['thumbnail'] = thumbnail;\n }\n return publishParams;\n },\n createThumbnailPublishParams (thumbnailFilePath, claimName, license, nsfw) {\n if (!thumbnailFilePath) {\n return;\n }\n logger.debug(`Creating Thumbnail Publish Parameters`);\n // create the publish params\n return {\n name : `${claimName}-thumb`,\n file_path: thumbnailFilePath,\n bid : 0.01,\n metadata : {\n title : `${claimName} thumbnail`,\n description: `a thumbnail for ${claimName}`,\n author : site.title,\n language : 'en',\n license,\n nsfw,\n },\n claim_address: wallet.lbryClaimAddress,\n channel_name : publish.thumbnailChannel,\n channel_id : publish.thumbnailChannelId,\n };\n },\n deleteTemporaryFile (filePath) {\n fs.unlink(filePath, err => {\n if (err) {\n logger.error(`error deleting temporary file ${filePath}`);\n throw err;\n }\n logger.debug(`successfully deleted ${filePath}`);\n });\n },\n addGetResultsToFileData (fileInfo, getResult) {\n fileInfo.fileName = getResult.file_name;\n fileInfo.filePath = getResult.download_path;\n return fileInfo;\n },\n createFileData ({ name, claimId, outpoint, height, address, nsfw, contentType }) {\n return {\n name,\n claimId,\n outpoint,\n height,\n address,\n fileName: '',\n filePath: '',\n fileType: contentType,\n nsfw,\n };\n },\n};\n\n\n\n// WEBPACK FOOTER //\n// ./helpers/publishHelpers.js","const logger = require('winston');\n\nmodule.exports = {\n handleErrorResponse: function (originalUrl, ip, error, res) {\n logger.error(`Error on ${originalUrl}`, module.exports.useObjectPropertiesIfNoKeys(error));\n const [status, message] = module.exports.returnErrorMessageAndStatus(error);\n res\n .status(status)\n .json(module.exports.createErrorResponsePayload(status, message));\n },\n returnErrorMessageAndStatus: function (error) {\n let status, message;\n // check for daemon being turned off\n if (error.code === 'ECONNREFUSED') {\n status = 503;\n message = 'Connection refused. The daemon may not be running.';\n // fallback for everything else\n } else {\n status = 400;\n if (error.message) {\n message = error.message;\n } else {\n message = error;\n };\n };\n return [status, message];\n },\n useObjectPropertiesIfNoKeys: function (err) {\n if (Object.keys(err).length === 0) {\n let newErrorObject = {};\n Object.getOwnPropertyNames(err).forEach((key) => {\n newErrorObject[key] = err[key];\n });\n return newErrorObject;\n }\n return err;\n },\n createErrorResponsePayload (status, message) {\n return {\n status,\n success: false,\n message,\n };\n },\n};\n\n\n\n// WEBPACK FOOTER //\n// ./helpers/errorHandlers.js","const db = require('../models');\nconst logger = require('winston');\nconst { returnPaginatedChannelClaims } = require('../helpers/channelPagination.js');\n\nconst NO_CHANNEL = 'NO_CHANNEL';\nconst NO_CLAIM = 'NO_CLAIM';\nconst NO_FILE = 'NO_FILE';\n\nmodule.exports = {\n getClaimId (channelName, channelClaimId, name, claimId) {\n if (channelName) {\n return module.exports.getClaimIdByChannel(channelName, channelClaimId, name);\n } else {\n return module.exports.getClaimIdByClaim(name, claimId);\n }\n },\n getClaimIdByClaim (claimName, claimId) {\n logger.debug(`getClaimIdByClaim(${claimName}, ${claimId})`);\n return new Promise((resolve, reject) => {\n db.Claim.getLongClaimId(claimName, claimId)\n .then(longClaimId => {\n if (!longClaimId) {\n resolve(NO_CLAIM);\n }\n resolve(longClaimId);\n })\n .catch(error => {\n reject(error);\n });\n });\n },\n getClaimIdByChannel (channelName, channelClaimId, claimName) {\n logger.debug(`getClaimIdByChannel(${channelName}, ${channelClaimId}, ${claimName})`);\n return new Promise((resolve, reject) => {\n db.Certificate.getLongChannelId(channelName, channelClaimId) // 1. get the long channel id\n .then(longChannelId => {\n if (!longChannelId) {\n return [null, null];\n }\n return Promise.all([longChannelId, db.Claim.getClaimIdByLongChannelId(longChannelId, claimName)]); // 2. get the long claim id\n })\n .then(([longChannelId, longClaimId]) => {\n if (!longChannelId) {\n return resolve(NO_CHANNEL);\n }\n if (!longClaimId) {\n return resolve(NO_CLAIM);\n }\n resolve(longClaimId);\n })\n .catch(error => {\n reject(error);\n });\n });\n },\n getChannelData (channelName, channelClaimId, page) {\n return new Promise((resolve, reject) => {\n // 1. get the long channel Id (make sure channel exists)\n db.Certificate.getLongChannelId(channelName, channelClaimId)\n .then(longChannelClaimId => {\n if (!longChannelClaimId) {\n return [null, null, null];\n }\n // 2. get the short ID and all claims for that channel\n return Promise.all([longChannelClaimId, db.Certificate.getShortChannelIdFromLongChannelId(longChannelClaimId, channelName)]);\n })\n .then(([longChannelClaimId, shortChannelClaimId]) => {\n if (!longChannelClaimId) {\n return resolve(NO_CHANNEL);\n }\n // 3. return all the channel information\n resolve({\n channelName,\n longChannelClaimId,\n shortChannelClaimId,\n });\n })\n .catch(error => {\n reject(error);\n });\n });\n },\n getChannelClaims (channelName, channelClaimId, page) {\n return new Promise((resolve, reject) => {\n // 1. get the long channel Id (make sure channel exists)\n db.Certificate.getLongChannelId(channelName, channelClaimId)\n .then(longChannelClaimId => {\n if (!longChannelClaimId) {\n return [null, null, null];\n }\n // 2. get the short ID and all claims for that channel\n return Promise.all([longChannelClaimId, db.Claim.getAllChannelClaims(longChannelClaimId)]);\n })\n .then(([longChannelClaimId, channelClaimsArray]) => {\n if (!longChannelClaimId) {\n return resolve(NO_CHANNEL);\n }\n // 3. format the data for the view, including pagination\n let paginatedChannelViewData = returnPaginatedChannelClaims(channelName, longChannelClaimId, channelClaimsArray, page);\n // 4. return all the channel information and contents\n resolve(paginatedChannelViewData);\n })\n .catch(error => {\n reject(error);\n });\n });\n },\n getLocalFileRecord (claimId, name) {\n return db.File.findOne({where: {claimId, name}})\n .then(file => {\n if (!file) {\n return NO_FILE;\n }\n return file.dataValues;\n });\n },\n};\n\n\n\n// WEBPACK FOOTER //\n// ./controllers/serveController.js","import React from 'react';\nimport { renderToString } from 'react-dom/server';\nimport { createStore } from 'redux';\nimport Reducer from '../react/reducers';\nimport { Provider } from 'react-redux';\nimport { StaticRouter } from 'react-router-dom';\nimport GAListener from '../react/components/GAListener';\nimport App from '../react/app';\nimport renderFullPage from './renderFullPage.js';\nimport Helmet from 'react-helmet';\n\nmodule.exports = (req, res) => {\n let context = {};\n\n // create a new Redux store instance\n const store = createStore(Reducer);\n\n // render component to a string\n const html = renderToString(\n \n \n \n \n \n \n \n );\n\n // get head tags from helmet\n const helmet = Helmet.renderStatic();\n\n // check for a redirect\n if (context.url) {\n // Somewhere a `` was rendered\n return res.redirect(301, context.url);\n } else {\n // we're good, send the response\n }\n\n // get the initial state from our Redux store\n const preloadedState = store.getState();\n\n // send the rendered page back to the client\n res.send(renderFullPage(helmet, html, preloadedState));\n};\n\n\n\n// WEBPACK FOOTER //\n// ./helpers/handlePageRender.jsx","module.exports = require(\"react-dom/server\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"react-dom/server\"\n// module id = 29\n// module chunks = 0","import { combineReducers } from 'redux';\nimport PublishReducer from 'reducers/publish';\nimport ChannelReducer from 'reducers/channel';\nimport ShowReducer from 'reducers/show';\nimport SiteReducer from 'reducers/site';\n\nexport default combineReducers({\n channel: ChannelReducer,\n publish: PublishReducer,\n show : ShowReducer,\n site : SiteReducer,\n});\n\n\n\n// WEBPACK FOOTER //\n// ./react/reducers/index.js","export const FILE_SELECTED = 'FILE_SELECTED';\nexport const FILE_CLEAR = 'FILE_CLEAR';\nexport const METADATA_UPDATE = 'METADATA_UPDATE';\nexport const CLAIM_UPDATE = 'CLAIM_UPDATE';\nexport const SET_PUBLISH_IN_CHANNEL = 'SET_PUBLISH_IN_CHANNEL';\nexport const PUBLISH_STATUS_UPDATE = 'PUBLISH_STATUS_UPDATE';\nexport const ERROR_UPDATE = 'ERROR_UPDATE';\nexport const SELECTED_CHANNEL_UPDATE = 'SELECTED_CHANNEL_UPDATE';\nexport const TOGGLE_METADATA_INPUTS = 'TOGGLE_METADATA_INPUTS';\nexport const THUMBNAIL_NEW = 'THUMBNAIL_NEW';\nexport const PUBLISH_START = 'PUBLISH_START';\n\n\n\n// WEBPACK FOOTER //\n// ./react/constants/publish_action_types.js","export const LOGIN = 'Existing';\nexport const CREATE = 'New';\n\n\n\n// WEBPACK FOOTER //\n// ./react/constants/publish_channel_select_states.js","export const CHANNEL_UPDATE = 'CHANNEL_UPDATE';\n\n\n\n// WEBPACK FOOTER //\n// ./react/constants/channel_action_types.js","export const LOCAL_CHECK = 'LOCAL_CHECK';\nexport const UNAVAILABLE = 'UNAVAILABLE';\nexport const ERROR = 'ERROR';\nexport const AVAILABLE = 'AVAILABLE';\n\n\n\n// WEBPACK FOOTER //\n// ./react/constants/asset_display_states.js","import React from 'react';\nimport GoogleAnalytics from 'react-ga';\nimport { withRouter } from 'react-router-dom';\nconst config = require('../../../config/speechConfig.js');\nconst googleApiKey = config.analytics.googleId;\n\nGoogleAnalytics.initialize(googleApiKey);\n\nclass GAListener extends React.Component {\n componentDidMount () {\n this.sendPageView(this.props.history.location);\n this.props.history.listen(this.sendPageView);\n }\n\n sendPageView (location) {\n GoogleAnalytics.set({ page: location.pathname });\n GoogleAnalytics.pageview(location.pathname);\n }\n\n render () {\n return this.props.children;\n }\n}\n\nexport default withRouter(GAListener);\n\n\n\n// WEBPACK FOOTER //\n// ./react/components/GAListener/index.jsx","import React from 'react';\nimport { Route, Switch } from 'react-router-dom';\nimport HomePage from 'components/HomePage';\nimport AboutPage from 'components/AboutPage';\nimport LoginPage from 'containers/LoginPage';\nimport ShowPage from 'containers/ShowPage';\nimport FourOhFourPage from 'components/FourOhFourPage';\n\nconst App = () => {\n return (\n \n \n \n \n \n \n \n \n );\n};\n\nexport default App;\n\n\n\n// WEBPACK FOOTER //\n// ./react/app.js","import { connect } from 'react-redux';\nimport { selectFile, updateError, clearFile } from 'actions/publish';\nimport View from './view';\n\nconst mapStateToProps = ({ publish }) => {\n return {\n file : publish.file,\n thumbnail: publish.thumbnail,\n fileError: publish.error.file,\n };\n};\n\nconst mapDispatchToProps = dispatch => {\n return {\n selectFile: (file) => {\n dispatch(selectFile(file));\n },\n setFileError: (value) => {\n dispatch(clearFile());\n dispatch(updateError('file', value));\n },\n };\n};\n\nexport default connect(mapStateToProps, mapDispatchToProps)(View);\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/Dropzone/index.js","import { connect } from 'react-redux';\nimport { updateLoggedInChannel } from 'actions/channel';\nimport View from './view';\nimport {updateSelectedChannel} from '../../actions/publish';\n\nconst mapDispatchToProps = dispatch => {\n return {\n onChannelLogin: (name, shortId, longId) => {\n dispatch(updateLoggedInChannel(name, shortId, longId));\n dispatch(updateSelectedChannel(name));\n },\n };\n};\n\nexport default connect(null, mapDispatchToProps)(View);\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/ChannelLoginForm/index.js","import { connect } from 'react-redux';\nimport { updateLoggedInChannel } from 'actions/channel';\nimport View from './view';\nimport {updateSelectedChannel} from 'actions/publish';\n\nconst mapDispatchToProps = dispatch => {\n return {\n onChannelLogin: (name, shortId, longId) => {\n dispatch(updateLoggedInChannel(name, shortId, longId));\n dispatch(updateSelectedChannel(name));\n },\n };\n};\n\nexport default connect(null, mapDispatchToProps)(View);\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/ChannelCreateForm/index.js","export const CHANNEL = 'CHANNEL';\nexport const ASSET_LITE = 'ASSET_LITE';\nexport const ASSET_DETAILS = 'ASSET_DETAILS';\n\n\n\n// WEBPACK FOOTER //\n// ./react/constants/show_request_types.js","import { connect } from 'react-redux';\nimport View from './view';\nimport { fileRequested } from 'actions/show';\nimport { selectAsset } from 'selectors/show';\n\nconst mapStateToProps = ({ show }) => {\n // select error and status\n const error = show.displayAsset.error;\n const status = show.displayAsset.status;\n // select asset\n const asset = selectAsset(show);\n // return props\n return {\n error,\n status,\n asset,\n };\n};\n\nconst mapDispatchToProps = dispatch => {\n return {\n onFileRequest: (name, claimId) => {\n dispatch(fileRequested(name, claimId));\n },\n };\n};\n\nexport default connect(mapStateToProps, mapDispatchToProps)(View);\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/AssetDisplay/index.js","module.exports = (helmet, html, preloadedState) => {\n // take the html and preloadedState and return the full page\n return `\n \n \n \n \n \n \n \n ${helmet.title.toString()}\n ${helmet.meta.toString()}\n ${helmet.link.toString()}\n \n \n \n \n \n \n \n \n
\n
${html}
\n
\n \n \n \n \n `;\n};\n\n\n\n// WEBPACK FOOTER //\n// ./helpers/renderFullPage.js","module.exports = require(\"babel-polyfill\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"babel-polyfill\"\n// module id = 44\n// module chunks = 0","module.exports = require(\"whatwg-fetch\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"whatwg-fetch\"\n// module id = 45\n// module chunks = 0","// load dependencies\nconst express = require('express');\nconst bodyParser = require('body-parser');\nconst expressHandlebars = require('express-handlebars');\nconst Handlebars = require('handlebars');\nconst { populateLocalsDotUser, serializeSpeechUser, deserializeSpeechUser } = require('./helpers/authHelpers.js');\nconst config = require('./config/speechConfig.js');\nconst logger = require('winston');\nconst helmet = require('helmet');\nconst PORT = 3000; // set port\nconst app = express(); // create an Express application\nconst passport = require('passport');\nconst cookieSession = require('cookie-session');\n\n// configure logging\nconst logLevel = config.logging.logLevel;\nrequire('./config/loggerConfig.js')(logger, logLevel);\nrequire('./config/slackConfig.js')(logger);\n\n// check for global config variables\nrequire('./helpers/configVarCheck.js')();\n\n// trust the proxy to get ip address for us\napp.enable('trust proxy');\n\n// add middleware\napp.use(helmet()); // set HTTP headers to protect against well-known web vulnerabilties\napp.use(express.static(`${__dirname}/public`)); // 'express.static' to serve static files from public directory\napp.use(bodyParser.json()); // 'body parser' for parsing application/json\napp.use(bodyParser.urlencoded({ extended: true })); // 'body parser' for parsing application/x-www-form-urlencoded\napp.use((req, res, next) => { // custom logging middleware to log all incoming http requests\n logger.verbose(`Request on ${req.originalUrl} from ${req.ip}`);\n next();\n});\n\n// configure passport\npassport.serializeUser(serializeSpeechUser);\npassport.deserializeUser(deserializeSpeechUser);\nconst localSignupStrategy = require('./passport/local-signup.js');\nconst localLoginStrategy = require('./passport/local-login.js');\npassport.use('local-signup', localSignupStrategy);\npassport.use('local-login', localLoginStrategy);\n// initialize passport\napp.use(cookieSession({\n name : 'session',\n keys : [config.session.sessionKey],\n maxAge: 24 * 60 * 60 * 1000, // 24 hours\n}));\napp.use(passport.initialize());\napp.use(passport.session());\n\n// configure handlebars & register it with express app\nconst hbs = expressHandlebars.create({\n defaultLayout: 'embed', // sets the default layout\n handlebars : Handlebars, // includes basic handlebars for access to that library\n});\napp.engine('handlebars', hbs.engine);\napp.set('view engine', 'handlebars');\n\n// middleware to pass user info back to client (for handlebars access), if user is logged in\napp.use(populateLocalsDotUser);\n\n// start the server\nconst startServer = (mysqlConfig) => {\n const db = require('./models')(mysqlConfig); // require our models for syncing\n db.sequelize\n // sync sequelize\n .sync()\n // require routes\n .then(() => {\n require('./routes/auth-routes.js')(app);\n require('./routes/api-routes.js')(app);\n require('./routes/page-routes.js')(app);\n require('./routes/serve-routes.js')(app);\n require('./routes/fallback-routes.js')(app);\n const http = require('http');\n return http.Server(app);\n })\n // start the server\n .then(server => {\n server.listen(PORT, () => {\n logger.info('Trusting proxy?', app.get('trust proxy'));\n logger.info(`Server is listening on PORT ${PORT}`);\n });\n })\n .catch((error) => {\n logger.error(`Startup Error:`, error);\n });\n};\n\nmodule.exports = {\n hello () {\n console.log('hello world');\n },\n speak (something) {\n console.log(something);\n },\n // start (config) {\n // const { mysqlConfig } = config;\n // startServer(mysqlConfig);\n // },\n};\n\n\n\n// WEBPACK FOOTER //\n// ./server.js","module.exports = require(\"express\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"express\"\n// module id = 47\n// module chunks = 0","module.exports = require(\"body-parser\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"body-parser\"\n// module id = 48\n// module chunks = 0","module.exports = require(\"express-handlebars\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"express-handlebars\"\n// module id = 49\n// module chunks = 0","module.exports = require(\"handlebars\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"handlebars\"\n// module id = 50\n// module chunks = 0","// const db = require('../models'); // require our models for syncing\nconst logger = require('winston');\n\nmodule.exports = {\n populateLocalsDotUser (req, res, next) {\n if (req.user) {\n logger.debug('populating res.locals.user');\n res.locals.user = {\n id : req.user.id,\n userName : req.user.userName,\n channelName : req.user.channelName,\n channelClaimId: req.user.channelClaimId,\n shortChannelId: req.user.shortChannelId,\n };\n }\n next();\n },\n serializeSpeechUser (user, done) { // returns user data to be serialized into session\n logger.debug('serializing user');\n done(null, user);\n },\n deserializeSpeechUser (user, done) { // deserializes session and populates additional info to req.user\n logger.debug('deserializing user');\n done(null, user);\n },\n};\n\n\n\n// WEBPACK FOOTER //\n// ./helpers/authHelpers.js","module.exports = require(\"helmet\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"helmet\"\n// module id = 52\n// module chunks = 0","module.exports = require(\"cookie-session\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"cookie-session\"\n// module id = 53\n// module chunks = 0","module.exports = (winston, logLevel) => {\n winston.configure({\n transports: [\n new (winston.transports.Console)({\n level : logLevel,\n timestamp : false,\n colorize : true,\n prettyPrint : true,\n handleExceptions : true,\n humanReadableUnhandledException: true,\n }),\n ],\n });\n\n winston.error('Level 0');\n winston.warn('Level 1');\n winston.info('Level 2');\n winston.verbose('Level 3');\n winston.debug('Level 4');\n winston.silly('Level 5');\n};\n\n\n\n// WEBPACK FOOTER //\n// ./config/loggerConfig.js","const { logging } = require('./speechConfig.js');\nconst { slackWebHook, slackErrorChannel, slackInfoChannel } = logging;\nconst winstonSlackWebHook = require('winston-slack-webhook').SlackWebHook;\n\nmodule.exports = (winston) => {\n if (slackWebHook) {\n // add a transport for errors to slack\n if (slackErrorChannel) {\n winston.add(winstonSlackWebHook, {\n name : 'slack-errors-transport',\n level : 'warn',\n webhookUrl: slackWebHook,\n channel : slackErrorChannel,\n username : 'spee.ch',\n iconEmoji : ':face_with_head_bandage:',\n });\n };\n if (slackInfoChannel) {\n winston.add(winstonSlackWebHook, {\n name : 'slack-info-transport',\n level : 'info',\n webhookUrl: slackWebHook,\n channel : slackInfoChannel,\n username : 'spee.ch',\n iconEmoji : ':nerd_face:',\n });\n };\n // send test message\n winston.error('Slack \"error\" logging is online.');\n winston.info('Slack \"info\" logging is online.');\n } else {\n winston.warn('Slack logging is not enabled because no slackWebHook config var provided.');\n }\n};\n\n\n\n// WEBPACK FOOTER //\n// ./config/slackConfig.js","module.exports = require(\"winston-slack-webhook\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"winston-slack-webhook\"\n// module id = 56\n// module chunks = 0","const config = require('../config/speechConfig.js');\nconst logger = require('winston');\n\nmodule.exports = function () {\n // get the config file\n\n for (let configCategoryKey in config) {\n if (config.hasOwnProperty(configCategoryKey)) {\n // get the final variables for each config category\n const configVariables = config[configCategoryKey];\n for (let configVarKey in configVariables) {\n if (configVariables.hasOwnProperty(configVarKey)) {\n // print each variable\n logger.debug(`CONFIG CHECK: ${configCategoryKey}.${configVarKey} === ${configVariables[configVarKey]}`);\n }\n }\n }\n }\n};\n\n\n\n// WEBPACK FOOTER //\n// ./helpers/configVarCheck.js","const db = require('../models');\nconst PassportLocalStrategy = require('passport-local').Strategy;\nconst lbryApi = require('../helpers/lbryApi.js');\nconst logger = require('winston');\n\nmodule.exports = new PassportLocalStrategy(\n {\n usernameField: 'username',\n passwordField: 'password',\n },\n (username, password, done) => {\n logger.verbose(`new channel signup request. user: ${username} pass: ${password} .`);\n let userInfo = {};\n // server-side validaton of inputs (username, password)\n\n // create the channel and retrieve the metadata\n return lbryApi.createChannel(`@${username}`)\n .then(tx => {\n // create user record\n const userData = {\n userName: username,\n password: password,\n };\n logger.verbose('userData >', userData);\n // create user record\n const channelData = {\n channelName : `@${username}`,\n channelClaimId: tx.claim_id,\n };\n logger.verbose('channelData >', channelData);\n // create certificate record\n const certificateData = {\n claimId: tx.claim_id,\n name : `@${username}`,\n // address,\n };\n logger.verbose('certificateData >', certificateData);\n // save user and certificate to db\n return Promise.all([db.User.create(userData), db.Channel.create(channelData), db.Certificate.create(certificateData)]);\n })\n .then(([newUser, newChannel, newCertificate]) => {\n logger.verbose('user and certificate successfully created');\n // store the relevant newUser info to be passed back for req.User\n userInfo['id'] = newUser.id;\n userInfo['userName'] = newUser.userName;\n userInfo['channelName'] = newChannel.channelName;\n userInfo['channelClaimId'] = newChannel.channelClaimId;\n // associate the instances\n return Promise.all([newCertificate.setChannel(newChannel), newChannel.setUser(newUser)]);\n })\n .then(() => {\n logger.verbose('user and certificate successfully associated');\n return db.Certificate.getShortChannelIdFromLongChannelId(userInfo.channelClaimId, userInfo.channelName);\n })\n .then(shortChannelId => {\n userInfo['shortChannelId'] = shortChannelId;\n return done(null, userInfo);\n })\n .catch(error => {\n logger.error('signup error', error);\n return done(error);\n });\n }\n);\n\n\n\n// WEBPACK FOOTER //\n// ./passport/local-signup.js","module.exports = require(\"sequelize\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"sequelize\"\n// module id = 59\n// module chunks = 0","const logger = require('winston');\nconst { returnShortId } = require('../helpers/sequelizeHelpers.js');\n\nmodule.exports = (sequelize, { STRING, BOOLEAN, INTEGER, TEXT, DECIMAL }) => {\n const Certificate = sequelize.define(\n 'Certificate',\n {\n address: {\n type : STRING,\n default: null,\n },\n amount: {\n type : DECIMAL(19, 8),\n default: null,\n },\n claimId: {\n type : STRING,\n default: null,\n },\n claimSequence: {\n type : INTEGER,\n default: null,\n },\n decodedClaim: {\n type : BOOLEAN,\n default: null,\n },\n depth: {\n type : INTEGER,\n default: null,\n },\n effectiveAmount: {\n type : DECIMAL(19, 8),\n default: null,\n },\n hasSignature: {\n type : BOOLEAN,\n default: null,\n },\n height: {\n type : INTEGER,\n default: null,\n },\n hex: {\n type : TEXT('long'),\n default: null,\n },\n name: {\n type : STRING,\n default: null,\n },\n nout: {\n type : INTEGER,\n default: null,\n },\n txid: {\n type : STRING,\n default: null,\n },\n validAtHeight: {\n type : INTEGER,\n default: null,\n },\n outpoint: {\n type : STRING,\n default: null,\n },\n valueVersion: {\n type : STRING,\n default: null,\n },\n claimType: {\n type : STRING,\n default: null,\n },\n certificateVersion: {\n type : STRING,\n default: null,\n },\n keyType: {\n type : STRING,\n default: null,\n },\n publicKey: {\n type : TEXT('long'),\n default: null,\n },\n },\n {\n freezeTableName: true,\n }\n );\n\n Certificate.associate = db => {\n Certificate.belongsTo(db.Channel, {\n foreignKey: {\n allowNull: true,\n },\n });\n };\n\n Certificate.getShortChannelIdFromLongChannelId = function (longChannelId, channelName) {\n logger.debug(`getShortChannelIdFromLongChannelId ${channelName}:${longChannelId}`);\n return new Promise((resolve, reject) => {\n this\n .findAll({\n where: {name: channelName},\n order: [['height', 'ASC']],\n })\n .then(result => {\n switch (result.length) {\n case 0:\n throw new Error('No channel(s) found with that channel name');\n default:\n return resolve(returnShortId(result, longChannelId));\n }\n })\n .catch(error => {\n reject(error);\n });\n });\n };\n\n Certificate.getLongChannelIdFromShortChannelId = function (channelName, channelClaimId) {\n logger.debug(`getLongChannelIdFromShortChannelId(${channelName}, ${channelClaimId})`);\n return new Promise((resolve, reject) => {\n this\n .findAll({\n where: {\n name : channelName,\n claimId: {\n $like: `${channelClaimId}%`,\n },\n },\n order: [['height', 'ASC']],\n })\n .then(result => {\n switch (result.length) {\n case 0:\n return resolve(null);\n default: // note results must be sorted\n return resolve(result[0].claimId);\n }\n })\n .catch(error => {\n reject(error);\n });\n });\n };\n\n Certificate.getLongChannelIdFromChannelName = function (channelName) {\n logger.debug(`getLongChannelIdFromChannelName(${channelName})`);\n return new Promise((resolve, reject) => {\n this\n .findAll({\n where: { name: channelName },\n order: [['effectiveAmount', 'DESC'], ['height', 'ASC']],\n })\n .then(result => {\n switch (result.length) {\n case 0:\n return resolve(null);\n default:\n return resolve(result[0].claimId);\n }\n })\n .catch(error => {\n reject(error);\n });\n });\n };\n\n Certificate.validateLongChannelId = function (name, claimId) {\n logger.debug(`validateLongChannelId(${name}, ${claimId})`);\n return new Promise((resolve, reject) => {\n this.findOne({\n where: {name, claimId},\n })\n .then(result => {\n if (!result) {\n return resolve(null);\n };\n resolve(claimId);\n })\n .catch(error => {\n reject(error);\n });\n });\n };\n\n Certificate.getLongChannelId = function (channelName, channelClaimId) {\n logger.debug(`getLongChannelId(${channelName}, ${channelClaimId})`);\n if (channelClaimId && (channelClaimId.length === 40)) { // if a full channel id is provided\n return this.validateLongChannelId(channelName, channelClaimId);\n } else if (channelClaimId && channelClaimId.length < 40) { // if a short channel id is provided\n return this.getLongChannelIdFromShortChannelId(channelName, channelClaimId);\n } else {\n return this.getLongChannelIdFromChannelName(channelName); // if no channel id provided\n }\n };\n\n return Certificate;\n};\n\n\n\n// WEBPACK FOOTER //\n// ./models/certificate.js","module.exports = (sequelize, { STRING }) => {\n const Channel = sequelize.define(\n 'Channel',\n {\n channelName: {\n type : STRING,\n allowNull: false,\n },\n channelClaimId: {\n type : STRING,\n allowNull: false,\n },\n },\n {\n freezeTableName: true,\n }\n );\n\n Channel.associate = db => {\n Channel.belongsTo(db.User);\n Channel.hasOne(db.Certificate);\n };\n\n return Channel;\n};\n\n\n\n// WEBPACK FOOTER //\n// ./models/channel.js","const logger = require('winston');\nconst { returnShortId } = require('../helpers/sequelizeHelpers.js');\nconst { claim, site } = require('../config/speechConfig.js');\nconst { defaultThumbnail } = claim;\n\nfunction determineFileExtensionFromContentType (contentType) {\n switch (contentType) {\n case 'image/jpeg':\n case 'image/jpg':\n return 'jpeg';\n case 'image/png':\n return 'png';\n case 'image/gif':\n return 'gif';\n case 'video/mp4':\n return 'mp4';\n default:\n logger.debug('setting unknown file type as file extension jpeg');\n return 'jpeg';\n }\n};\n\nfunction determineThumbnail (storedThumbnail, defaultThumbnail) {\n if (storedThumbnail === '') {\n return defaultThumbnail;\n }\n return storedThumbnail;\n};\n\nfunction prepareClaimData (claim) {\n // logger.debug('preparing claim data based on resolved data:', claim);\n claim['thumbnail'] = determineThumbnail(claim.thumbnail, defaultThumbnail);\n claim['fileExt'] = determineFileExtensionFromContentType(claim.contentType);\n claim['host'] = site.host;\n return claim;\n};\n\nmodule.exports = (sequelize, { STRING, BOOLEAN, INTEGER, TEXT, DECIMAL }) => {\n const Claim = sequelize.define(\n 'Claim',\n {\n address: {\n type : STRING,\n default: null,\n },\n amount: {\n type : DECIMAL(19, 8),\n default: null,\n },\n claimId: {\n type : STRING,\n default: null,\n },\n claimSequence: {\n type : INTEGER,\n default: null,\n },\n decodedClaim: {\n type : BOOLEAN,\n default: null,\n },\n depth: {\n type : INTEGER,\n default: null,\n },\n effectiveAmount: {\n type : DECIMAL(19, 8),\n default: null,\n },\n hasSignature: {\n type : BOOLEAN,\n default: null,\n },\n height: {\n type : INTEGER,\n default: null,\n },\n hex: {\n type : TEXT('long'),\n default: null,\n },\n name: {\n type : STRING,\n default: null,\n },\n nout: {\n type : INTEGER,\n default: null,\n },\n txid: {\n type : STRING,\n default: null,\n },\n validAtHeight: {\n type : INTEGER,\n default: null,\n },\n outpoint: {\n type : STRING,\n default: null,\n },\n claimType: {\n type : STRING,\n default: null,\n },\n certificateId: {\n type : STRING,\n default: null,\n },\n author: {\n type : STRING,\n default: null,\n },\n description: {\n type : TEXT('long'),\n default: null,\n },\n language: {\n type : STRING,\n default: null,\n },\n license: {\n type : STRING,\n default: null,\n },\n licenseUrl: {\n type : STRING,\n default: null,\n },\n nsfw: {\n type : BOOLEAN,\n default: null,\n },\n preview: {\n type : STRING,\n default: null,\n },\n thumbnail: {\n type : STRING,\n default: null,\n },\n title: {\n type : STRING,\n default: null,\n },\n metadataVersion: {\n type : STRING,\n default: null,\n },\n contentType: {\n type : STRING,\n default: null,\n },\n source: {\n type : STRING,\n default: null,\n },\n sourceType: {\n type : STRING,\n default: null,\n },\n sourceVersion: {\n type : STRING,\n default: null,\n },\n streamVersion: {\n type : STRING,\n default: null,\n },\n valueVersion: {\n type : STRING,\n default: null,\n },\n channelName: {\n type : STRING,\n allowNull: true,\n default : null,\n },\n },\n {\n freezeTableName: true,\n }\n );\n\n Claim.associate = db => {\n Claim.belongsTo(db.File, {\n foreignKey: {\n allowNull: true,\n },\n });\n };\n\n Claim.getShortClaimIdFromLongClaimId = function (claimId, claimName) {\n logger.debug(`Claim.getShortClaimIdFromLongClaimId for ${claimName}#${claimId}`);\n return new Promise((resolve, reject) => {\n this\n .findAll({\n where: { name: claimName },\n order: [['height', 'ASC']],\n })\n .then(result => {\n switch (result.length) {\n case 0:\n throw new Error('No claim(s) found with that claim name');\n default:\n resolve(returnShortId(result, claimId));\n }\n })\n .catch(error => {\n reject(error);\n });\n });\n };\n\n Claim.getAllChannelClaims = function (channelClaimId) {\n logger.debug(`Claim.getAllChannelClaims for ${channelClaimId}`);\n return new Promise((resolve, reject) => {\n this\n .findAll({\n where: { certificateId: channelClaimId },\n order: [['height', 'ASC']],\n raw : true, // returns an array of only data, not an array of instances\n })\n .then(channelClaimsArray => {\n // logger.debug('channelclaimsarray length:', channelClaimsArray.length);\n switch (channelClaimsArray.length) {\n case 0:\n return resolve(null);\n default:\n channelClaimsArray.forEach(claim => {\n claim['fileExt'] = determineFileExtensionFromContentType(claim.contentType);\n claim['thumbnail'] = determineThumbnail(claim.thumbnail, defaultThumbnail);\n return claim;\n });\n return resolve(channelClaimsArray);\n }\n })\n .catch(error => {\n reject(error);\n });\n });\n };\n\n Claim.getClaimIdByLongChannelId = function (channelClaimId, claimName) {\n logger.debug(`finding claim id for claim ${claimName} from channel ${channelClaimId}`);\n return new Promise((resolve, reject) => {\n this\n .findAll({\n where: { name: claimName, certificateId: channelClaimId },\n order: [['id', 'ASC']],\n })\n .then(result => {\n switch (result.length) {\n case 0:\n return resolve(null);\n case 1:\n return resolve(result[0].claimId);\n default:\n logger.error(`${result.length} records found for \"${claimName}\" in channel \"${channelClaimId}\"`);\n return resolve(result[0].claimId);\n }\n })\n .catch(error => {\n reject(error);\n });\n });\n };\n\n Claim.getLongClaimIdFromShortClaimId = function (name, shortId) {\n return new Promise((resolve, reject) => {\n this\n .findAll({\n where: {\n name,\n claimId: {\n $like: `${shortId}%`,\n }},\n order: [['height', 'ASC']],\n })\n .then(result => {\n switch (result.length) {\n case 0:\n return resolve(null);\n default: // note results must be sorted\n return resolve(result[0].claimId);\n }\n })\n .catch(error => {\n reject(error);\n });\n });\n };\n\n Claim.getTopFreeClaimIdByClaimName = function (name) {\n return new Promise((resolve, reject) => {\n this\n .findAll({\n where: { name },\n order: [['effectiveAmount', 'DESC'], ['height', 'ASC']], // note: maybe height and effective amount need to switch?\n })\n .then(result => {\n logger.debug('length of result', result.length);\n switch (result.length) {\n case 0:\n return resolve(null);\n default:\n return resolve(result[0].dataValues.claimId);\n }\n })\n .catch(error => {\n reject(error);\n });\n });\n };\n\n Claim.validateLongClaimId = function (name, claimId) {\n return new Promise((resolve, reject) => {\n this.findOne({\n where: {name, claimId},\n })\n .then(result => {\n if (!result) {\n return resolve(null);\n };\n resolve(claimId);\n })\n .catch(error => {\n reject(error);\n });\n });\n };\n\n Claim.getLongClaimId = function (claimName, claimId) {\n logger.debug(`getLongClaimId(${claimName}, ${claimId})`);\n if (claimId && (claimId.length === 40)) { // if a full claim id is provided\n return this.validateLongClaimId(claimName, claimId);\n } else if (claimId && claimId.length < 40) {\n return this.getLongClaimIdFromShortClaimId(claimName, claimId); // if a short claim id is provided\n } else {\n return this.getTopFreeClaimIdByClaimName(claimName); // if no claim id is provided\n }\n };\n\n Claim.resolveClaim = function (name, claimId) {\n logger.debug(`Claim.resolveClaim: ${name} ${claimId}`);\n return new Promise((resolve, reject) => {\n this\n .findAll({\n where: { name, claimId },\n })\n .then(claimArray => {\n logger.debug('claims found on resolve:', claimArray.length);\n switch (claimArray.length) {\n case 0:\n return resolve(null);\n case 1:\n return resolve(prepareClaimData(claimArray[0].dataValues));\n default:\n logger.error(`more than one entry matches that name (${name}) and claimID (${claimId})`);\n return resolve(prepareClaimData(claimArray[0].dataValues));\n }\n })\n .catch(error => {\n reject(error);\n });\n });\n };\n\n return Claim;\n};\n\n\n\n// WEBPACK FOOTER //\n// ./models/claim.js","module.exports = (sequelize, { STRING, BOOLEAN, INTEGER }) => {\n const File = sequelize.define(\n 'File',\n {\n name: {\n type : STRING,\n allowNull: false,\n },\n claimId: {\n type : STRING,\n allowNull: false,\n },\n address: {\n type : STRING,\n allowNull: false,\n },\n outpoint: {\n type : STRING,\n allowNull: false,\n },\n height: {\n type : INTEGER,\n allowNull: false,\n default : 0,\n },\n fileName: {\n type : STRING,\n allowNull: false,\n },\n filePath: {\n type : STRING,\n allowNull: false,\n },\n fileType: {\n type: STRING,\n },\n nsfw: {\n type : BOOLEAN,\n allowNull : false,\n defaultValue: false,\n },\n trendingEligible: {\n type : BOOLEAN,\n allowNull : false,\n defaultValue: true,\n },\n },\n {\n freezeTableName: true,\n }\n );\n\n File.associate = db => {\n File.hasMany(db.Request);\n File.hasOne(db.Claim);\n };\n\n File.getRecentClaims = function () {\n return this.findAll({\n where: { nsfw: false, trendingEligible: true },\n order: [['createdAt', 'DESC']],\n limit: 25,\n });\n };\n\n return File;\n};\n\n\n\n// WEBPACK FOOTER //\n// ./models/file.js","module.exports = (sequelize, { STRING, BOOLEAN, TEXT }) => {\n const Request = sequelize.define(\n 'Request',\n {\n action: {\n type : STRING,\n allowNull: false,\n },\n url: {\n type : STRING,\n allowNull: false,\n },\n ipAddress: {\n type : STRING,\n allowNull: true,\n },\n result: {\n type : TEXT('long'),\n allowNull: true,\n default : null,\n },\n },\n {\n freezeTableName: true,\n }\n );\n\n Request.associate = db => {\n Request.belongsTo(db.File, {\n foreignKey: {\n allowNull: true,\n },\n });\n };\n\n return Request;\n};\n\n\n\n// WEBPACK FOOTER //\n// ./models/request.js","'use strict';\nconst bcrypt = require('bcrypt');\nconst logger = require('winston');\n\nmodule.exports = (sequelize, { STRING }) => {\n const User = sequelize.define(\n 'User',\n {\n userName: {\n type : STRING,\n allowNull: false,\n },\n password: {\n type : STRING,\n allowNull: false,\n },\n },\n {\n freezeTableName: true,\n }\n );\n\n User.associate = db => {\n User.hasOne(db.Channel);\n };\n\n User.prototype.comparePassword = function (password) {\n return bcrypt.compare(password, this.password);\n };\n\n User.prototype.changePassword = function (newPassword) {\n return new Promise((resolve, reject) => {\n // generate a salt string to use for hashing\n bcrypt.genSalt((saltError, salt) => {\n if (saltError) {\n logger.error('salt error', saltError);\n reject(saltError);\n return;\n }\n // generate a hashed version of the user's password\n bcrypt.hash(newPassword, salt, (hashError, hash) => {\n // if there is an error with the hash generation return the error\n if (hashError) {\n logger.error('hash error', hashError);\n reject(hashError);\n return;\n }\n // replace the current password with the new hash\n this\n .update({password: hash})\n .then(() => {\n resolve();\n })\n .catch(error => {\n reject(error);\n });\n });\n });\n });\n };\n\n // pre-save hook method to hash the user's password before the user's info is saved to the db.\n User.hook('beforeCreate', (user, options) => {\n logger.debug('User.beforeCreate hook...');\n return new Promise((resolve, reject) => {\n // generate a salt string to use for hashing\n bcrypt.genSalt((saltError, salt) => {\n if (saltError) {\n logger.error('salt error', saltError);\n reject(saltError);\n return;\n }\n // generate a hashed version of the user's password\n bcrypt.hash(user.password, salt, (hashError, hash) => {\n // if there is an error with the hash generation return the error\n if (hashError) {\n logger.error('hash error', hashError);\n reject(hashError);\n return;\n }\n // replace the password string with the hash password value\n user.password = hash;\n resolve();\n });\n });\n });\n });\n\n return User;\n};\n\n\n\n// WEBPACK FOOTER //\n// ./models/user.js","module.exports = require(\"bcrypt\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"bcrypt\"\n// module id = 66\n// module chunks = 0","module.exports = require(\"axios\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"axios\"\n// module id = 67\n// module chunks = 0","module.exports = require(\"universal-analytics\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"universal-analytics\"\n// module id = 68\n// module chunks = 0","const PassportLocalStrategy = require('passport-local').Strategy;\nconst db = require('../models');\nconst logger = require('winston');\n\nfunction returnUserAndChannelInfo (userInstance) {\n return new Promise((resolve, reject) => {\n let userInfo = {};\n userInfo['id'] = userInstance.id;\n userInfo['userName'] = userInstance.userName;\n userInstance\n .getChannel()\n .then(({channelName, channelClaimId}) => {\n userInfo['channelName'] = channelName;\n userInfo['channelClaimId'] = channelClaimId;\n return db.Certificate.getShortChannelIdFromLongChannelId(channelClaimId, channelName);\n })\n .then(shortChannelId => {\n userInfo['shortChannelId'] = shortChannelId;\n resolve(userInfo);\n })\n .catch(error => {\n reject(error);\n });\n });\n}\n\nmodule.exports = new PassportLocalStrategy(\n {\n usernameField: 'username',\n passwordField: 'password',\n },\n (username, password, done) => {\n return db.User\n .findOne({\n where: {userName: username},\n })\n .then(user => {\n if (!user) {\n logger.debug('no user found');\n return done(null, false, {message: 'Incorrect username or password'});\n }\n return user.comparePassword(password)\n .then(isMatch => {\n if (!isMatch) {\n logger.debug('incorrect password');\n return done(null, false, {message: 'Incorrect username or password'});\n }\n logger.debug('Password was a match, returning User');\n return returnUserAndChannelInfo(user)\n .then(userInfo => {\n return done(null, userInfo);\n })\n .catch(error => {\n return error;\n });\n })\n .catch(error => {\n return error;\n });\n })\n .catch(error => {\n return done(error);\n });\n }\n);\n\n\n\n// WEBPACK FOOTER //\n// ./passport/local-login.js","const logger = require('winston');\nconst passport = require('passport');\n\nmodule.exports = (app) => {\n // route for sign up\n app.post('/signup', passport.authenticate('local-signup'), (req, res) => {\n logger.verbose(`successful signup for ${req.user.channelName}`);\n res.status(200).json({\n success : true,\n channelName : req.user.channelName,\n channelClaimId: req.user.channelClaimId,\n shortChannelId: req.user.shortChannelId,\n });\n });\n // route for log in\n app.post('/login', (req, res, next) => {\n passport.authenticate('local-login', (err, user, info) => {\n logger.debug('info:', info);\n if (err) {\n return next(err);\n }\n if (!user) {\n return res.status(400).json({\n success: false,\n message: info.message,\n });\n }\n logger.debug('successful login');\n req.logIn(user, (err) => {\n if (err) {\n return next(err);\n }\n return res.status(200).json({\n success : true,\n channelName : req.user.channelName,\n channelClaimId: req.user.channelClaimId,\n shortChannelId: req.user.shortChannelId,\n });\n });\n })(req, res, next);\n });\n // route to log out\n app.get('/logout', (req, res) => {\n req.logout();\n res.status(200).json({success: true, message: 'you successfully logged out'});\n });\n // see if user is authenticated, and return credentials if so\n app.get('/user', (req, res) => {\n if (req.user) {\n res.status(200).json({success: true, data: req.user});\n } else {\n res.status(401).json({success: false, message: 'user is not logged in'});\n }\n });\n};\n\n\n\n// WEBPACK FOOTER //\n// ./routes/auth-routes.js","const logger = require('winston');\nconst multipart = require('connect-multiparty');\nconst { files, site } = require('../config/speechConfig.js');\nconst multipartMiddleware = multipart({uploadDir: files.uploadDirectory});\nconst db = require('../models');\nconst { claimNameIsAvailable, checkChannelAvailability, publish } = require('../controllers/publishController.js');\nconst { getClaimList, resolveUri, getClaim } = require('../helpers/lbryApi.js');\nconst { addGetResultsToFileData, createBasicPublishParams, createThumbnailPublishParams, parsePublishApiRequestBody, parsePublishApiRequestFiles, createFileData } = require('../helpers/publishHelpers.js');\nconst errorHandlers = require('../helpers/errorHandlers.js');\nconst { sendGATimingEvent } = require('../helpers/googleAnalytics.js');\nconst { authenticateUser } = require('../auth/authentication.js');\nconst { getChannelData, getChannelClaims, getClaimId } = require('../controllers/serveController.js');\n\nconst NO_CHANNEL = 'NO_CHANNEL';\nconst NO_CLAIM = 'NO_CLAIM';\n\nmodule.exports = (app) => {\n // route to check whether site has published to a channel\n app.get('/api/channel/availability/:name', ({ ip, originalUrl, params }, res) => {\n checkChannelAvailability(params.name)\n .then(result => {\n if (result === true) {\n res.status(200).json(true);\n } else {\n res.status(200).json(false);\n }\n })\n .catch(error => {\n errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n });\n });\n // route to get a short channel id from long channel Id\n app.get('/api/channel/short-id/:longId/:name', ({ ip, originalUrl, params }, res) => {\n db.Certificate.getShortChannelIdFromLongChannelId(params.longId, params.name)\n .then(shortId => {\n res.status(200).json(shortId);\n })\n .catch(error => {\n errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n });\n });\n app.get('/api/channel/data/:channelName/:channelClaimId', ({ ip, originalUrl, body, params }, res) => {\n const channelName = params.channelName;\n let channelClaimId = params.channelClaimId;\n if (channelClaimId === 'none') channelClaimId = null;\n getChannelData(channelName, channelClaimId, 0)\n .then(data => {\n if (data === NO_CHANNEL) {\n return res.status(404).json({success: false, message: 'No matching channel was found'});\n }\n res.status(200).json({success: true, data});\n })\n .catch(error => {\n errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n });\n });\n app.get('/api/channel/claims/:channelName/:channelClaimId/:page', ({ ip, originalUrl, body, params }, res) => {\n const channelName = params.channelName;\n let channelClaimId = params.channelClaimId;\n if (channelClaimId === 'none') channelClaimId = null;\n const page = params.page;\n getChannelClaims(channelName, channelClaimId, page)\n .then(data => {\n if (data === NO_CHANNEL) {\n return res.status(404).json({success: false, message: 'No matching channel was found'});\n }\n res.status(200).json({success: true, data});\n })\n .catch(error => {\n errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n });\n });\n // route to run a claim_list request on the daemon\n app.get('/api/claim/list/:name', ({ ip, originalUrl, params }, res) => {\n getClaimList(params.name)\n .then(claimsList => {\n res.status(200).json(claimsList);\n })\n .catch(error => {\n errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n });\n });\n // route to get an asset\n app.get('/api/claim/get/:name/:claimId', ({ ip, originalUrl, params }, res) => {\n const name = params.name;\n const claimId = params.claimId;\n // resolve the claim\n db.Claim.resolveClaim(name, claimId)\n .then(resolveResult => {\n // make sure a claim actually exists at that uri\n if (!resolveResult) {\n throw new Error('No matching uri found in Claim table');\n }\n let fileData = createFileData(resolveResult);\n // get the claim\n return Promise.all([fileData, getClaim(`${name}#${claimId}`)]);\n })\n .then(([ fileData, getResult ]) => {\n fileData = addGetResultsToFileData(fileData, getResult);\n return Promise.all([db.upsert(db.File, fileData, {name, claimId}, 'File'), getResult]);\n })\n .then(([ fileRecord, {message, completed} ]) => {\n res.status(200).json({ success: true, message, completed });\n })\n .catch(error => {\n errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n });\n });\n // route to check whether this site published to a claim\n app.get('/api/claim/availability/:name', ({ ip, originalUrl, params }, res) => {\n claimNameIsAvailable(params.name)\n .then(result => {\n res.status(200).json(result);\n })\n .catch(error => {\n errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n });\n });\n // route to run a resolve request on the daemon\n app.get('/api/claim/resolve/:name/:claimId', ({ headers, ip, originalUrl, params }, res) => {\n resolveUri(`${params.name}#${params.claimId}`)\n .then(resolvedUri => {\n res.status(200).json(resolvedUri);\n })\n .catch(error => {\n errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n });\n });\n // route to run a publish request on the daemon\n app.post('/api/claim/publish', multipartMiddleware, ({ body, files, headers, ip, originalUrl, user }, res) => {\n logger.debug('api/claim/publish req.body:', body);\n logger.debug('api/claim/publish req.files:', files);\n // define variables\n let channelName, channelId, channelPassword, description, fileName, filePath, fileType, gaStartTime, license, name, nsfw, thumbnail, thumbnailFileName, thumbnailFilePath, thumbnailFileType, title;\n // record the start time of the request\n gaStartTime = Date.now();\n // validate the body and files of the request\n try {\n // validateApiPublishRequest(body, files);\n ({name, nsfw, license, title, description, thumbnail} = parsePublishApiRequestBody(body));\n ({fileName, filePath, fileType, thumbnailFileName, thumbnailFilePath, thumbnailFileType} = parsePublishApiRequestFiles(files));\n ({channelName, channelId, channelPassword} = body);\n } catch (error) {\n return res.status(400).json({success: false, message: error.message});\n }\n // check channel authorization\n Promise.all([\n authenticateUser(channelName, channelId, channelPassword, user),\n claimNameIsAvailable(name),\n createBasicPublishParams(filePath, name, title, description, license, nsfw, thumbnail),\n createThumbnailPublishParams(thumbnailFilePath, name, license, nsfw),\n ])\n .then(([{channelName, channelClaimId}, validatedClaimName, publishParams, thumbnailPublishParams]) => {\n // add channel details to the publish params\n if (channelName && channelClaimId) {\n publishParams['channel_name'] = channelName;\n publishParams['channel_id'] = channelClaimId;\n }\n // publish the thumbnail\n if (thumbnailPublishParams) {\n publish(thumbnailPublishParams, thumbnailFileName, thumbnailFileType);\n }\n // publish the asset\n return publish(publishParams, fileName, fileType);\n })\n .then(result => {\n res.status(200).json({\n success: true,\n message: 'publish completed successfully',\n data : {\n name,\n claimId: result.claim_id,\n url : `${site.host}/${result.claim_id}/${name}`,\n lbryTx : result,\n },\n });\n // record the publish end time and send to google analytics\n sendGATimingEvent('end-to-end', 'publish', fileType, gaStartTime, Date.now());\n })\n .catch(error => {\n errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n });\n });\n // route to get a short claim id from long claim Id\n app.get('/api/claim/short-id/:longId/:name', ({ ip, originalUrl, body, params }, res) => {\n db.Claim.getShortClaimIdFromLongClaimId(params.longId, params.name)\n .then(shortId => {\n res.status(200).json({success: true, data: shortId});\n })\n .catch(error => {\n errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n });\n });\n app.post('/api/claim/long-id', ({ ip, originalUrl, body, params }, res) => {\n logger.debug('body:', body);\n const channelName = body.channelName;\n const channelClaimId = body.channelClaimId;\n const claimName = body.claimName;\n const claimId = body.claimId;\n getClaimId(channelName, channelClaimId, claimName, claimId)\n .then(result => {\n if (result === NO_CHANNEL) {\n return res.status(404).json({success: false, message: 'No matching channel could be found'});\n }\n if (result === NO_CLAIM) {\n return res.status(404).json({success: false, message: 'No matching claim id could be found'});\n }\n res.status(200).json({success: true, data: result});\n })\n .catch(error => {\n errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n });\n });\n app.get('/api/claim/data/:claimName/:claimId', ({ ip, originalUrl, body, params }, res) => {\n const claimName = params.claimName;\n let claimId = params.claimId;\n if (claimId === 'none') claimId = null;\n db.Claim.resolveClaim(claimName, claimId)\n .then(claimInfo => {\n if (!claimInfo) {\n return res.status(404).json({success: false, message: 'No claim could be found'});\n }\n res.status(200).json({success: true, data: claimInfo});\n })\n .catch(error => {\n errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n });\n });\n // route to see if asset is available locally\n app.get('/api/file/availability/:name/:claimId', ({ ip, originalUrl, params }, res) => {\n const name = params.name;\n const claimId = params.claimId;\n db.File.findOne({where: {name, claimId}})\n .then(result => {\n if (result) {\n return res.status(200).json({success: true, data: true});\n }\n res.status(200).json({success: true, data: false});\n })\n .catch(error => {\n errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n });\n });\n};\n\n\n\n// WEBPACK FOOTER //\n// ./routes/api-routes.js","module.exports = require(\"connect-multiparty\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"connect-multiparty\"\n// module id = 72\n// module chunks = 0","const logger = require('winston');\nconst db = require('../models');\nconst lbryApi = require('../helpers/lbryApi.js');\nconst publishHelpers = require('../helpers/publishHelpers.js');\nconst config = require('../config/speechConfig.js');\n\nmodule.exports = {\n publish (publishParams, fileName, fileType) {\n return new Promise((resolve, reject) => {\n let publishResults, certificateId, channelName;\n // publish the file\n return lbryApi.publishClaim(publishParams)\n .then(tx => {\n logger.info(`Successfully published ${publishParams.name} ${fileName}`, tx);\n publishResults = tx;\n // get the channel information\n if (publishParams.channel_name) {\n logger.debug(`this claim was published in channel: ${publishParams.channel_name}`);\n return db.Channel.findOne({where: {channelName: publishParams.channel_name}});\n } else {\n logger.debug('this claim was not published in a channel');\n return null;\n }\n })\n .then(channel => {\n // set channel information\n certificateId = null;\n channelName = null;\n if (channel) {\n certificateId = channel.channelClaimId;\n channelName = channel.channelName;\n }\n logger.debug(`certificateId: ${certificateId}`);\n })\n .then(() => {\n // create the File record\n const fileRecord = {\n name : publishParams.name,\n claimId : publishResults.claim_id,\n title : publishParams.metadata.title,\n description: publishParams.metadata.description,\n address : publishParams.claim_address,\n outpoint : `${publishResults.txid}:${publishResults.nout}`,\n height : 0,\n fileName,\n filePath : publishParams.file_path,\n fileType,\n nsfw : publishParams.metadata.nsfw,\n };\n // create the Claim record\n const claimRecord = {\n name : publishParams.name,\n claimId : publishResults.claim_id,\n title : publishParams.metadata.title,\n description: publishParams.metadata.description,\n address : publishParams.claim_address,\n thumbnail : publishParams.metadata.thumbnail,\n outpoint : `${publishResults.txid}:${publishResults.nout}`,\n height : 0,\n contentType: fileType,\n nsfw : publishParams.metadata.nsfw,\n amount : publishParams.bid,\n certificateId,\n channelName,\n };\n // upsert criteria\n const upsertCriteria = {\n name : publishParams.name,\n claimId: publishResults.claim_id,\n };\n // upsert the records\n return Promise.all([db.upsert(db.File, fileRecord, upsertCriteria, 'File'), db.upsert(db.Claim, claimRecord, upsertCriteria, 'Claim')]);\n })\n .then(([file, claim]) => {\n logger.debug('File and Claim records successfully created');\n return Promise.all([file.setClaim(claim), claim.setFile(file)]);\n })\n .then(() => {\n logger.debug('File and Claim records successfully associated');\n resolve(publishResults); // resolve the promise with the result from lbryApi.publishClaim;\n })\n .catch(error => {\n logger.error('PUBLISH ERROR', error);\n publishHelpers.deleteTemporaryFile(publishParams.file_path); // delete the local file\n reject(error);\n });\n });\n },\n claimNameIsAvailable (name) {\n // find any records where the name is used\n return db.File.findAll({ where: { name } })\n .then(result => {\n if (result.length >= 1) {\n const claimAddress = config.wallet.lbryClaimAddress;\n // filter out any results that were not published from spee.ch's wallet address\n const filteredResult = result.filter((claim) => {\n return (claim.address === claimAddress);\n });\n // return based on whether any non-spee.ch claims were left\n if (filteredResult.length >= 1) {\n throw new Error('That claim is already in use');\n };\n return name;\n };\n return name;\n });\n },\n checkChannelAvailability (name) {\n return new Promise((resolve, reject) => {\n // find any records where the name is used\n db.Channel.findAll({ where: { channelName: name } })\n .then(result => {\n if (result.length >= 1) {\n return resolve(false);\n }\n resolve(true);\n })\n .catch(error => {\n reject(error);\n });\n });\n },\n};\n\n\n\n// WEBPACK FOOTER //\n// ./controllers/publishController.js","module.exports = require(\"fs\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"fs\"\n// module id = 74\n// module chunks = 0","const db = require('../models');\nconst logger = require('winston');\n\nmodule.exports = {\n authenticateUser (channelName, channelId, channelPassword, user) {\n // case: no channelName or channel Id are provided (anonymous), regardless of whether user token is provided\n if (!channelName && !channelId) {\n return {\n channelName : null,\n channelClaimId: null,\n };\n }\n // case: channelName or channel Id are provided with user token\n if (user) {\n if (channelName && channelName !== user.channelName) {\n throw new Error('the provided channel name does not match user credentials');\n }\n if (channelId && channelId !== user.channelClaimId) {\n throw new Error('the provided channel id does not match user credentials');\n }\n return {\n channelName : user.channelName,\n channelClaimId: user.channelClaimId,\n };\n }\n // case: channelName or channel Id are provided with password instead of user token\n if (!channelPassword) throw new Error('no channel password provided');\n return module.exports.authenticateChannelCredentials(channelName, channelId, channelPassword);\n },\n authenticateChannelCredentials (channelName, channelId, userPassword) {\n return new Promise((resolve, reject) => {\n // hoisted variables\n let channelData;\n // build the params for finding the channel\n let channelFindParams = {};\n if (channelName) channelFindParams['channelName'] = channelName;\n if (channelId) channelFindParams['channelClaimId'] = channelId;\n // find the channel\n db.Channel\n .findOne({\n where: channelFindParams,\n })\n .then(channel => {\n if (!channel) {\n logger.debug('no channel found');\n throw new Error('Authentication failed, you do not have access to that channel');\n }\n channelData = channel.get();\n logger.debug('channel data:', channelData);\n return db.User.findOne({\n where: { userName: channelData.channelName.substring(1) },\n });\n })\n .then(user => {\n if (!user) {\n logger.debug('no user found');\n throw new Error('Authentication failed, you do not have access to that channel');\n }\n return user.comparePassword(userPassword);\n })\n .then(isMatch => {\n if (!isMatch) {\n logger.debug('incorrect password');\n throw new Error('Authentication failed, you do not have access to that channel');\n }\n logger.debug('...password was a match...');\n resolve(channelData);\n })\n .catch(error => {\n reject(error);\n });\n });\n },\n};\n\n\n\n// WEBPACK FOOTER //\n// ./auth/authentication.js","const CLAIMS_PER_PAGE = 12;\n\nmodule.exports = {\n returnPaginatedChannelClaims (channelName, longChannelClaimId, claims, page) {\n const totalPages = module.exports.determineTotalPages(claims);\n const paginationPage = module.exports.getPageFromQuery(page);\n const viewData = {\n channelName : channelName,\n longChannelClaimId: longChannelClaimId,\n claims : module.exports.extractPageFromClaims(claims, paginationPage),\n previousPage : module.exports.determinePreviousPage(paginationPage),\n currentPage : paginationPage,\n nextPage : module.exports.determineNextPage(totalPages, paginationPage),\n totalPages : totalPages,\n totalResults : module.exports.determineTotalClaims(claims),\n };\n return viewData;\n },\n getPageFromQuery (page) {\n if (page) {\n return parseInt(page);\n }\n return 1;\n },\n extractPageFromClaims (claims, pageNumber) {\n if (!claims) {\n return []; // if no claims, return this default\n }\n // logger.debug('claims is array?', Array.isArray(claims));\n // logger.debug(`pageNumber ${pageNumber} is number?`, Number.isInteger(pageNumber));\n const claimStartIndex = (pageNumber - 1) * CLAIMS_PER_PAGE;\n const claimEndIndex = claimStartIndex + CLAIMS_PER_PAGE;\n const pageOfClaims = claims.slice(claimStartIndex, claimEndIndex);\n return pageOfClaims;\n },\n determineTotalPages (claims) {\n if (!claims) {\n return 0;\n } else {\n const totalClaims = claims.length;\n if (totalClaims < CLAIMS_PER_PAGE) {\n return 1;\n }\n const fullPages = Math.floor(totalClaims / CLAIMS_PER_PAGE);\n const remainder = totalClaims % CLAIMS_PER_PAGE;\n if (remainder === 0) {\n return fullPages;\n }\n return fullPages + 1;\n }\n },\n determinePreviousPage (currentPage) {\n if (currentPage === 1) {\n return null;\n }\n return currentPage - 1;\n },\n determineNextPage (totalPages, currentPage) {\n if (currentPage === totalPages) {\n return null;\n }\n return currentPage + 1;\n },\n determineTotalClaims (claims) {\n if (!claims) {\n return 0;\n }\n return claims.length;\n },\n};\n\n\n\n// WEBPACK FOOTER //\n// ./helpers/channelPagination.js","const { site } = require('../config/speechConfig.js');\nconst handlePageRender = require('../helpers/handlePageRender.jsx');\n\nmodule.exports = (app) => {\n // route for the home page\n app.get('/', (req, res) => {\n handlePageRender(req, res);\n });\n // route to display login page\n app.get('/login', (req, res) => {\n handlePageRender(req, res);\n });\n // route to show 'about' page\n app.get('/about', (req, res) => {\n handlePageRender(req, res);\n });\n // route to display a list of the trending images\n app.get('/trending', (req, res) => {\n res.status(301).redirect('/popular');\n });\n app.get('/popular', (req, res) => {\n handlePageRender(req, res);\n });\n // route to display a list of the trending images\n app.get('/new', (req, res) => {\n handlePageRender(req, res);\n });\n // route to send embedable video player (for twitter)\n app.get('/embed/:claimId/:name', ({ params }, res) => {\n const claimId = params.claimId;\n const name = params.name;\n const host = site.host;\n // get and render the content\n res.status(200).render('embed', { layout: 'embed', host, claimId, name });\n });\n};\n\n\n\n// WEBPACK FOOTER //\n// ./routes/page-routes.js","import * as actions from 'constants/publish_action_types';\nimport { LOGIN } from 'constants/publish_channel_select_states';\nconst { publish } = require('../../config/speechConfig.js');\n\nconst initialState = {\n publishInChannel : false,\n selectedChannel : LOGIN,\n showMetadataInputs: false,\n status : {\n status : null,\n message: null,\n },\n error: {\n file : null,\n url : null,\n channel : null,\n publishSubmit: null,\n },\n file : null,\n claim : '',\n metadata: {\n title : '',\n description: '',\n license : '',\n nsfw : false,\n },\n thumbnailChannel : publish.thumbnailChannel,\n thumbnailChannelId: publish.thumbnailChannelId,\n thumbnail : null,\n};\n\nexport default function (state = initialState, action) {\n switch (action.type) {\n case actions.FILE_SELECTED:\n return Object.assign({}, initialState, { // note: clears to initial state\n file: action.data,\n });\n case actions.FILE_CLEAR:\n return initialState;\n case actions.METADATA_UPDATE:\n return Object.assign({}, state, {\n metadata: Object.assign({}, state.metadata, {\n [action.data.name]: action.data.value,\n }),\n });\n case actions.CLAIM_UPDATE:\n return Object.assign({}, state, {\n claim: action.data,\n });\n case actions.SET_PUBLISH_IN_CHANNEL:\n return Object.assign({}, state, {\n publishInChannel: action.channel,\n });\n case actions.PUBLISH_STATUS_UPDATE:\n return Object.assign({}, state, {\n status: action.data,\n });\n case actions.ERROR_UPDATE:\n return Object.assign({}, state, {\n error: Object.assign({}, state.error, {\n [action.data.name]: action.data.value,\n }),\n });\n case actions.SELECTED_CHANNEL_UPDATE:\n return Object.assign({}, state, {\n selectedChannel: action.data,\n });\n case actions.TOGGLE_METADATA_INPUTS:\n return Object.assign({}, state, {\n showMetadataInputs: action.data,\n });\n case actions.THUMBNAIL_NEW:\n return Object.assign({}, state, {\n thumbnail: action.data,\n });\n default:\n return state;\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./react/reducers/publish.js","import * as actions from 'constants/channel_action_types';\n\nconst initialState = {\n loggedInChannel: {\n name : null,\n shortId: null,\n longId : null,\n },\n};\n\nexport default function (state = initialState, action) {\n switch (action.type) {\n case actions.CHANNEL_UPDATE:\n return Object.assign({}, state, {\n loggedInChannel: action.data,\n });\n default:\n return state;\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./react/reducers/channel.js","import * as actions from 'constants/show_action_types';\nimport { LOCAL_CHECK, ERROR } from 'constants/asset_display_states';\n\nconst initialState = {\n request: {\n error: null,\n type : null,\n id : null,\n },\n requestList : {},\n channelList : {},\n assetList : {},\n displayAsset: {\n error : null,\n status: LOCAL_CHECK,\n },\n};\n\nexport default function (state = initialState, action) {\n switch (action.type) {\n // handle request\n case actions.REQUEST_ERROR:\n return Object.assign({}, state, {\n request: Object.assign({}, state.request, {\n error: action.data,\n }),\n });\n case actions.REQUEST_UPDATE:\n return Object.assign({}, state, {\n request: Object.assign({}, state.request, {\n type: action.data.requestType,\n id : action.data.requestId,\n }),\n });\n // store requests\n case actions.REQUEST_LIST_ADD:\n return Object.assign({}, state, {\n requestList: Object.assign({}, state.requestList, {\n [action.data.id]: {\n error: action.data.error,\n key : action.data.key,\n },\n }),\n });\n // asset data\n case actions.ASSET_ADD:\n return Object.assign({}, state, {\n assetList: Object.assign({}, state.assetList, {\n [action.data.id]: {\n error : action.data.error,\n name : action.data.name,\n claimId : action.data.claimId,\n shortId : action.data.shortId,\n claimData: action.data.claimData,\n },\n }),\n });\n // channel data\n case actions.CHANNEL_ADD:\n return Object.assign({}, state, {\n channelList: Object.assign({}, state.channelList, {\n [action.data.id]: {\n name : action.data.name,\n longId : action.data.longId,\n shortId : action.data.shortId,\n claimsData: action.data.claimsData,\n },\n }),\n });\n case actions.CHANNEL_CLAIMS_UPDATE_SUCCESS:\n return Object.assign({}, state, {\n channelList: Object.assign({}, state.channelList, {\n [action.data.channelListId]: Object.assign({}, state.channelList[action.data.channelListId], {\n claimsData: action.data.claimsData,\n }),\n }),\n });\n // display an asset\n case actions.FILE_AVAILABILITY_UPDATE:\n return Object.assign({}, state, {\n displayAsset: Object.assign({}, state.displayAsset, {\n status: action.data,\n }),\n });\n case actions.DISPLAY_ASSET_ERROR:\n return Object.assign({}, state, {\n displayAsset: Object.assign({}, state.displayAsset, {\n error : action.data,\n status: ERROR,\n }),\n });\n default:\n return state;\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./react/reducers/show.js","const { site } = require('../../config/speechConfig.js');\n\nconst initialState = {\n host: site.host,\n};\n\nexport default function (state = initialState, action) {\n switch (action.type) {\n default:\n return state;\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./react/reducers/site.js","module.exports = require(\"react-ga\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"react-ga\"\n// module id = 82\n// module chunks = 0","import React from 'react';\nimport SEO from 'components/SEO';\nimport NavBar from 'containers/NavBar';\nimport PublishTool from 'containers/PublishTool';\n\nclass HomePage extends React.Component {\n render () {\n return (\n
\n \n \n
\n \n
\n
\n );\n }\n};\n\nexport default HomePage;\n\n\n\n// WEBPACK FOOTER //\n// ./react/components/HomePage/index.jsx","const { site: { title: siteTitle } } = require('../../config/speechConfig.js');\n\nexport const createPageTitle = (pageTitle) => {\n if (!pageTitle) {\n return `${siteTitle}`;\n }\n return `${siteTitle} - ${pageTitle}`;\n};\n\n\n\n// WEBPACK FOOTER //\n// ./react/utils/pageTitle.js","const { site: { title, host, description }, claim: { defaultThumbnail, defaultDescription } } = require('../../config/speechConfig.js');\n\nconst determineOgThumbnailContentType = (thumbnail) => {\n if (thumbnail) {\n const fileExt = thumbnail.substring(thumbnail.lastIndexOf('.'));\n switch (fileExt) {\n case 'jpeg':\n case 'jpg':\n return 'image/jpeg';\n case 'png':\n return 'image/png';\n case 'gif':\n return 'image/gif';\n case 'mp4':\n return 'video/mp4';\n default:\n return 'image/jpeg';\n }\n }\n return '';\n};\n\nconst createBasicMetaTags = () => {\n return [\n {property: 'og:title', content: title},\n {property: 'og:url', content: host},\n {property: 'og:site_name', content: title},\n {property: 'og:description', content: description},\n {property: 'twitter:site', content: '@spee_ch'},\n {property: 'twitter:card', content: 'summary'},\n ];\n};\n\nconst createChannelMetaTags = (channel) => {\n const { name, longId } = channel;\n return [\n {property: 'og:title', content: `${name} on ${title}`},\n {property: 'og:url', content: `${host}/${name}:${longId}`},\n {property: 'og:site_name', content: title},\n {property: 'og:description', content: `${name}, a channel on ${title}`},\n {property: 'twitter:site', content: '@spee_ch'},\n {property: 'twitter:card', content: 'summary'},\n ];\n};\n\nconst createAssetMetaTags = (asset) => {\n const { claimData } = asset;\n const { contentType } = claimData;\n const embedUrl = `${host}/${claimData.claimId}/${claimData.name}`;\n const showUrl = `${host}/${claimData.claimId}/${claimData.name}`;\n const source = `${host}/${claimData.claimId}/${claimData.name}.${claimData.fileExt}`;\n const ogTitle = claimData.title || claimData.name;\n const ogDescription = claimData.description || defaultDescription;\n const ogThumbnailContentType = determineOgThumbnailContentType(claimData.thumbnail);\n const ogThumbnail = claimData.thumbnail || defaultThumbnail;\n const metaTags = [\n {property: 'og:title', content: ogTitle},\n {property: 'og:url', content: showUrl},\n {property: 'og:site_name', content: title},\n {property: 'og:description', content: ogDescription},\n {property: 'og:image:width', content: 600},\n {property: 'og:image:height', content: 315},\n {property: 'twitter:site', content: '@spee_ch'},\n ];\n if (contentType === 'video/mp4' || contentType === 'video/webm') {\n metaTags.push({property: 'og:video', content: source});\n metaTags.push({property: 'og:video:secure_url', content: source});\n metaTags.push({property: 'og:video:type', content: contentType});\n metaTags.push({property: 'og:image', content: ogThumbnail});\n metaTags.push({property: 'og:image:type', content: ogThumbnailContentType});\n metaTags.push({property: 'og:type', content: 'video'});\n metaTags.push({property: 'twitter:card', content: 'player'});\n metaTags.push({property: 'twitter:player', content: embedUrl});\n metaTags.push({property: 'twitter:player:width', content: 600});\n metaTags.push({property: 'twitter:text:player_width', content: 600});\n metaTags.push({property: 'twitter:player:height', content: 337});\n metaTags.push({property: 'twitter:player:stream', content: source});\n metaTags.push({property: 'twitter:player:stream:content_type', content: contentType});\n } else {\n metaTags.push({property: 'og:image', content: source});\n metaTags.push({property: 'og:image:type', content: contentType});\n metaTags.push({property: 'og:type', content: 'article'});\n metaTags.push({property: 'twitter:card', content: 'summary_large_image'});\n }\n return metaTags;\n};\n\nexport const createMetaTags = (asset, channel) => {\n if (asset) {\n return createAssetMetaTags(asset);\n };\n if (channel) {\n return createChannelMetaTags(channel);\n };\n return createBasicMetaTags();\n};\n\n\n\n// WEBPACK FOOTER //\n// ./react/utils/metaTags.js","const { site: { host } } = require('../../config/speechConfig.js');\n\nconst createBasicCanonicalLink = (page) => {\n if (!page) {\n return `${host}`;\n };\n return `${host}/${page}`;\n};\n\nconst createAssetCanonicalLink = (asset) => {\n let channelName, certificateId, name, claimId;\n if (asset.claimData) {\n ({ channelName, certificateId, name, claimId } = asset.claimData);\n };\n if (channelName) {\n return `${host}/${channelName}:${certificateId}/${name}`;\n };\n return `${host}/${claimId}/${name}`;\n};\n\nconst createChannelCanonicalLink = (channel) => {\n const { name, longId } = channel;\n return `${host}/${name}:${longId}`;\n};\n\nexport const createCanonicalLink = (asset, channel, page) => {\n if (asset) {\n return createAssetCanonicalLink(asset);\n }\n if (channel) {\n return createChannelCanonicalLink(channel);\n }\n if (page) {\n return createBasicCanonicalLink(page);\n }\n return createBasicCanonicalLink();\n};\n\n\n\n// WEBPACK FOOTER //\n// ./react/utils/canonicalLink.js","import React from 'react';\nimport { NavLink, withRouter } from 'react-router-dom';\nimport Logo from 'components/Logo';\nimport NavBarChannelDropdown from 'components/NavBarChannelOptionsDropdown';\nimport request from 'utils/request';\n\nconst VIEW = 'VIEW';\nconst LOGOUT = 'LOGOUT';\n\nclass NavBar extends React.Component {\n constructor (props) {\n super(props);\n this.checkForLoggedInUser = this.checkForLoggedInUser.bind(this);\n this.logoutUser = this.logoutUser.bind(this);\n this.handleSelection = this.handleSelection.bind(this);\n }\n componentDidMount () {\n // check to see if the user is already logged in\n this.checkForLoggedInUser();\n }\n checkForLoggedInUser () {\n const params = {credentials: 'include'};\n request('/user', params)\n .then(({ data }) => {\n this.props.onChannelLogin(data.channelName, data.shortChannelId, data.channelClaimId);\n })\n .catch(error => {\n console.log('/user error:', error.message);\n });\n }\n logoutUser () {\n const params = {credentials: 'include'};\n request('/logout', params)\n .then(() => {\n this.props.onChannelLogout();\n })\n .catch(error => {\n console.log('/logout error', error.message);\n });\n }\n handleSelection (event) {\n const value = event.target.selectedOptions[0].value;\n switch (value) {\n case LOGOUT:\n this.logoutUser();\n break;\n case VIEW:\n // redirect to channel page\n this.props.history.push(`/${this.props.channelName}:${this.props.channelLongId}`);\n break;\n default:\n break;\n }\n }\n render () {\n return (\n
\n
\n \n
\n Open-source, decentralized image and video sharing.\n
\n
\n Publish\n About\n { this.props.channelName ? (\n \n ) : (\n Channel\n )}\n
\n
\n
\n );\n }\n}\n\nexport default withRouter(NavBar);\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/NavBar/view.jsx","import React from 'react';\nimport { Link } from 'react-router-dom';\n\nfunction Logo () {\n return (\n \n \n Logo\n Spee.ch logo\n \n \n \n Spee<h\n \n \n \n \n \n \n \n \n \n \n \n \n );\n};\n\nexport default Logo;\n\n\n\n// WEBPACK FOOTER //\n// ./react/components/Logo/index.jsx","import React from 'react';\n\nfunction NavBarChannelDropdown ({ channelName, handleSelection, defaultSelection, VIEW, LOGOUT }) {\n return (\n \n );\n};\n\nexport default NavBarChannelDropdown;\n\n\n\n// WEBPACK FOOTER //\n// ./react/components/NavBarChannelOptionsDropdown/index.jsx","module.exports = require(\"cross-fetch/polyfill\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"cross-fetch/polyfill\"\n// module id = 90\n// module chunks = 0","import {connect} from 'react-redux';\nimport View from './view';\n\nconst mapStateToProps = ({ publish }) => {\n return {\n file : publish.file,\n status: publish.status.status,\n };\n};\n\nexport default connect(mapStateToProps, null)(View);\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/PublishTool/index.js","import React from 'react';\nimport Dropzone from 'containers/Dropzone';\nimport PublishDetails from 'containers/PublishDetails';\nimport PublishStatus from 'containers/PublishStatus';\n\nclass PublishTool extends React.Component {\n render () {\n if (this.props.file) {\n if (this.props.status) {\n return (\n \n );\n } else {\n return ;\n }\n } else {\n return ;\n }\n }\n};\n\nexport default PublishTool;\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/PublishTool/view.jsx","import React from 'react';\nimport { validateFile } from 'utils/file';\nimport Preview from 'components/Preview';\n\nclass Dropzone extends React.Component {\n constructor (props) {\n super(props);\n this.state = {\n dragOver : false,\n mouseOver : false,\n dimPreview: false,\n };\n this.handleDrop = this.handleDrop.bind(this);\n this.handleDragOver = this.handleDragOver.bind(this);\n this.handleDragEnd = this.handleDragEnd.bind(this);\n this.handleDragEnter = this.handleDragEnter.bind(this);\n this.handleDragLeave = this.handleDragLeave.bind(this);\n this.handleMouseEnter = this.handleMouseEnter.bind(this);\n this.handleMouseLeave = this.handleMouseLeave.bind(this);\n this.handleClick = this.handleClick.bind(this);\n this.handleFileInput = this.handleFileInput.bind(this);\n this.chooseFile = this.chooseFile.bind(this);\n }\n handleDrop (event) {\n event.preventDefault();\n this.setState({dragOver: false});\n // if dropped items aren't files, reject them\n const dt = event.dataTransfer;\n if (dt.items) {\n if (dt.items[0].kind === 'file') {\n const droppedFile = dt.items[0].getAsFile();\n this.chooseFile(droppedFile);\n }\n }\n }\n handleDragOver (event) {\n event.preventDefault();\n }\n handleDragEnd (event) {\n var dt = event.dataTransfer;\n if (dt.items) {\n for (var i = 0; i < dt.items.length; i++) {\n dt.items.remove(i);\n }\n } else {\n event.dataTransfer.clearData();\n }\n }\n handleDragEnter () {\n this.setState({dragOver: true, dimPreview: true});\n }\n handleDragLeave () {\n this.setState({dragOver: false, dimPreview: false});\n }\n handleMouseEnter () {\n this.setState({mouseOver: true, dimPreview: true});\n }\n handleMouseLeave () {\n this.setState({mouseOver: false, dimPreview: false});\n }\n handleClick (event) {\n event.preventDefault();\n document.getElementById('file_input').click();\n }\n handleFileInput (event) {\n event.preventDefault();\n const fileList = event.target.files;\n this.chooseFile(fileList[0]);\n }\n chooseFile (file) {\n if (file) {\n try {\n validateFile(file); // validate the file's name, type, and size\n } catch (error) {\n return this.props.setFileError(error.message);\n }\n // stage it so it will be ready when the publish button is clicked\n this.props.selectFile(file);\n }\n }\n render () {\n return (\n
\n
\n \n
\n
\n {this.props.file ? (\n
\n \n
\n { this.state.dragOver ? (\n
\n

Drop it.

\n
\n ) : (\n null\n )}\n { this.state.mouseOver ? (\n
\n

{this.props.fileError}

\n

Drag & drop image or video here to publish

\n

OR

\n

CHOOSE FILE

\n
\n ) : (\n null\n )}\n
\n
\n ) : (\n
\n { this.state.dragOver ? (\n
\n

Drop it.

\n
\n ) : (\n
\n

{this.props.fileError}

\n

Drag & drop image or video here to publish

\n

OR

\n

CHOOSE FILE

\n
\n )}\n
\n )}\n
\n
\n );\n }\n};\n\nexport default Dropzone;\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/Dropzone/view.jsx","module.exports = {\n validateFile (file) {\n if (!file) {\n throw new Error('no file provided');\n }\n if (/'/.test(file.name)) {\n throw new Error('apostrophes are not allowed in the file name');\n }\n // validate size and type\n switch (file.type) {\n case 'image/jpeg':\n case 'image/jpg':\n case 'image/png':\n if (file.size > 10000000) {\n throw new Error('Sorry, images are limited to 10 megabytes.');\n }\n break;\n case 'image/gif':\n if (file.size > 50000000) {\n throw new Error('Sorry, GIFs are limited to 50 megabytes.');\n }\n break;\n case 'video/mp4':\n if (file.size > 50000000) {\n throw new Error('Sorry, videos are limited to 50 megabytes.');\n }\n break;\n default:\n throw new Error(file.type + ' is not a supported file type. Only, .jpeg, .png, .gif, and .mp4 files are currently supported.');\n }\n },\n};\n\n\n\n// WEBPACK FOOTER //\n// ./react/utils/file.js","import React from 'react';\nimport PropTypes from 'prop-types';\n\nclass Preview extends React.Component {\n constructor (props) {\n super(props);\n this.state = {\n imgSource : '',\n defaultThumbnail: '/assets/img/video_thumb_default.png',\n };\n }\n componentDidMount () {\n this.setPreviewImageSource(this.props.file);\n }\n componentWillReceiveProps (newProps) {\n if (newProps.file !== this.props.file) {\n this.setPreviewImageSource(newProps.file);\n }\n if (newProps.thumbnail !== this.props.thumbnail) {\n if (newProps.thumbnail) {\n this.setPreviewImageSourceFromFile(newProps.thumbnail);\n } else {\n this.setState({imgSource: this.state.defaultThumbnail});\n }\n }\n }\n setPreviewImageSourceFromFile (file) {\n const previewReader = new FileReader();\n previewReader.readAsDataURL(file);\n previewReader.onloadend = () => {\n this.setState({imgSource: previewReader.result});\n };\n }\n setPreviewImageSource (file) {\n if (file.type !== 'video/mp4') {\n this.setPreviewImageSourceFromFile(file);\n } else {\n if (this.props.thumbnail) {\n this.setPreviewImageSourceFromFile(this.props.thumbnail);\n }\n this.setState({imgSource: this.state.defaultThumbnail});\n }\n }\n render () {\n return (\n \n );\n }\n};\n\nPreview.propTypes = {\n dimPreview: PropTypes.bool.isRequired,\n file : PropTypes.object.isRequired,\n thumbnail : PropTypes.object,\n};\n\nexport default Preview;\n\n\n\n// WEBPACK FOOTER //\n// ./react/components/Preview/index.jsx","import {connect} from 'react-redux';\nimport {clearFile, startPublish} from 'actions/publish';\nimport View from './view';\n\nconst mapStateToProps = ({ channel, publish }) => {\n return {\n file: publish.file,\n };\n};\n\nconst mapDispatchToProps = {\n clearFile,\n startPublish,\n};\n\nexport default connect(mapStateToProps, mapDispatchToProps)(View);\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/PublishDetails/index.js","import React from 'react';\nimport { withRouter } from 'react-router-dom';\nimport Dropzone from 'containers/Dropzone';\nimport PublishTitleInput from 'containers/PublishTitleInput';\nimport PublishUrlInput from 'containers/PublishUrlInput';\nimport PublishThumbnailInput from 'containers/PublishThumbnailInput';\nimport PublishMetadataInputs from 'containers/PublishMetadataInputs';\nimport ChannelSelect from 'containers/ChannelSelect';\n\nclass PublishDetails extends React.Component {\n constructor (props) {\n super(props)\n this.onPublishSubmit = this.onPublishSubmit.bind(this);\n }\n onPublishSubmit () {\n this.props.startPublish(this.props.history);\n }\n render () {\n return (\n
\n
\n \n
\n {/* left column */}\n
\n
\n \n
\n
\n {/* right column */}\n
\n
\n
\n \n
\n
\n \n
\n { (this.props.file.type === 'video/mp4') && (\n
\n \n
\n )}\n
\n \n
\n
\n \n
\n
\n \n
\n
\n

By clicking 'Publish', you affirm that you have the rights to publish this content to the LBRY network, and that you understand the properties of publishing it to a decentralized, user-controlled network. Read more.

\n
\n
\n
\n
\n );\n }\n};\n\nexport default withRouter(PublishDetails);\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/PublishDetails/view.jsx","import {connect} from 'react-redux';\nimport {updateMetadata} from 'actions/publish';\nimport View from './view';\n\nconst mapStateToProps = ({ publish }) => {\n return {\n title: publish.metadata.title,\n };\n};\n\nconst mapDispatchToProps = dispatch => {\n return {\n onMetadataChange: (name, value) => {\n dispatch(updateMetadata(name, value));\n },\n };\n};\n\nexport default connect(mapStateToProps, mapDispatchToProps)(View);\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/PublishTitleInput/index.js","import React from 'react';\n\nclass PublishTitleInput extends React.Component {\n constructor (props) {\n super(props);\n this.handleInput = this.handleInput.bind(this);\n }\n handleInput (e) {\n const name = e.target.name;\n const value = e.target.value;\n this.props.onMetadataChange(name, value);\n }\n render () {\n return (\n \n );\n }\n}\n\nexport default PublishTitleInput;\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/PublishTitleInput/view.jsx","import {updateClaim, updateError} from 'actions/publish';\nimport {connect} from 'react-redux';\nimport View from './view';\n\nconst mapStateToProps = ({ channel, publish }) => {\n return {\n loggedInChannelName : channel.loggedInChannel.name,\n loggedInChannelShortId: channel.loggedInChannel.shortId,\n fileName : publish.file.name,\n publishInChannel : publish.publishInChannel,\n selectedChannel : publish.selectedChannel,\n claim : publish.claim,\n urlError : publish.error.url,\n };\n};\n\nconst mapDispatchToProps = dispatch => {\n return {\n onClaimChange: (value) => {\n dispatch(updateClaim(value));\n dispatch(updateError('publishSubmit', null));\n },\n onUrlError: (value) => {\n dispatch(updateError('url', value));\n },\n };\n};\n\nexport default connect(mapStateToProps, mapDispatchToProps)(View);\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/PublishUrlInput/index.js","import React from 'react';\nimport request from 'utils/request';\nimport UrlMiddle from 'components/PublishUrlMiddleDisplay';\n\nclass PublishUrlInput extends React.Component {\n constructor (props) {\n super(props);\n this.handleInput = this.handleInput.bind(this);\n }\n componentDidMount () {\n const { claim, fileName } = this.props;\n if (!claim) {\n this.setClaimName(fileName);\n }\n }\n componentWillReceiveProps ({ claim, fileName }) {\n // if a new file was chosen, update the claim name\n if (fileName !== this.props.fileName) {\n return this.setClaimName(fileName);\n }\n // if the claim has updated, check its availability\n if (claim !== this.props.claim) {\n this.validateClaim(claim);\n }\n }\n handleInput (event) {\n let value = event.target.value;\n value = this.cleanseInput(value);\n // update the state\n this.props.onClaimChange(value);\n }\n cleanseInput (input) {\n input = input.replace(/\\s+/g, '-'); // replace spaces with dashes\n input = input.replace(/[^A-Za-z0-9-]/g, ''); // remove all characters that are not A-Z, a-z, 0-9, or '-'\n return input;\n }\n setClaimName (fileName) {\n const fileNameWithoutEnding = fileName.substring(0, fileName.lastIndexOf('.'));\n const cleanClaimName = this.cleanseInput(fileNameWithoutEnding);\n this.props.onClaimChange(cleanClaimName);\n }\n validateClaim (claim) {\n if (!claim) {\n return this.props.onUrlError('Enter a url above');\n }\n request(`/api/claim/availability/${claim}`)\n .then(() => {\n this.props.onUrlError(null);\n })\n .catch((error) => {\n this.props.onUrlError(error.message);\n });\n }\n render () {\n const { claim, loggedInChannelName, loggedInChannelShortId, publishInChannel, selectedChannel, urlError } = this.props;\n return (\n
\n
\n spee.ch / \n \n \n { (claim && !urlError) && {'\\u2713'} }\n { urlError && {'\\u2716'} }\n
\n
\n { urlError ? (\n

{urlError}

\n ) : (\n

Choose a custom url

\n )}\n
\n
\n );\n }\n}\n\nexport default PublishUrlInput;\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/PublishUrlInput/view.jsx","import React from 'react';\nimport PropTypes from 'prop-types';\n\nfunction UrlMiddle ({publishInChannel, selectedChannel, loggedInChannelName, loggedInChannelShortId}) {\n if (publishInChannel) {\n if (selectedChannel === loggedInChannelName) {\n return {loggedInChannelName}:{loggedInChannelShortId} /;\n }\n return @channelSelect a channel below /;\n }\n return (\n xyzThis will be a random id /\n );\n}\n\nUrlMiddle.propTypes = {\n publishInChannel : PropTypes.bool.isRequired,\n loggedInChannelName : PropTypes.string,\n loggedInChannelShortId: PropTypes.string,\n};\n\nexport default UrlMiddle;\n\n\n\n// WEBPACK FOOTER //\n// ./react/components/PublishUrlMiddleDisplay/index.jsx","import { connect } from 'react-redux';\nimport { onNewThumbnail } from 'actions/publish';\nimport View from './view';\n\nconst mapStateToProps = ({ publish: { file } }) => {\n return {\n file,\n };\n};\n\nconst mapDispatchToProps = {\n onNewThumbnail,\n};\n\nexport default connect(mapStateToProps, mapDispatchToProps)(View);\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/PublishThumbnailInput/index.js","import React from 'react';\n\nfunction dataURItoBlob(dataURI) {\n // convert base64/URLEncoded data component to raw binary data held in a string\n let byteString = atob(dataURI.split(',')[1]);\n // separate out the mime component\n let mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0];\n // write the bytes of the string to a typed array\n let ia = new Uint8Array(byteString.length);\n for (let i = 0; i < byteString.length; i++) {\n ia[i] = byteString.charCodeAt(i);\n }\n return new Blob([ia], {type: mimeString});\n}\n\nclass PublishThumbnailInput extends React.Component {\n constructor (props) {\n super(props);\n this.state = {\n videoSource : null,\n error : null,\n sliderMinRange: 1,\n sliderMaxRange: null,\n sliderValue : null,\n };\n this.handleVideoLoadedData = this.handleVideoLoadedData.bind(this);\n this.handleSliderChange = this.handleSliderChange.bind(this);\n this.createThumbnail = this.createThumbnail.bind(this);\n }\n componentDidMount () {\n const { file } = this.props;\n this.setVideoSource(file);\n }\n componentWillReceiveProps (nextProps) {\n // if file changes\n if (nextProps.file && nextProps.file !== this.props.file) {\n const { file } = nextProps;\n this.setVideoSource(file);\n };\n }\n setVideoSource (file) {\n const previewReader = new FileReader();\n previewReader.readAsDataURL(file);\n previewReader.onloadend = () => {\n const dataUri = previewReader.result;\n const blob = dataURItoBlob(dataUri);\n const videoSource = URL.createObjectURL(blob);\n this.setState({ videoSource });\n };\n }\n handleVideoLoadedData (event) {\n const duration = event.target.duration;\n const totalMinutes = Math.floor(duration / 60);\n const totalSeconds = Math.floor(duration % 60);\n // set the slider\n this.setState({\n sliderMaxRange: duration * 100,\n sliderValue : duration * 100 / 2,\n totalMinutes,\n totalSeconds,\n });\n // update the current time of the video\n let video = document.getElementById('video-thumb-player');\n video.currentTime = duration / 2;\n }\n handleSliderChange (event) {\n const value = parseInt(event.target.value);\n // update the slider value\n this.setState({\n sliderValue: value,\n });\n // update the current time of the video\n let video = document.getElementById('video-thumb-player');\n video.currentTime = value / 100;\n }\n createThumbnail () {\n // take a snapshot\n let video = document.getElementById('video-thumb-player');\n let canvas = document.createElement('canvas');\n canvas.width = video.videoWidth;\n canvas.height = video.videoHeight;\n canvas.getContext('2d').drawImage(video, 0, 0, canvas.width, canvas.height);\n const dataUrl = canvas.toDataURL();\n const blob = dataURItoBlob(dataUrl);\n const snapshot = new File([blob], `thumbnail.png`, {\n type: 'image/png',\n });\n // set the thumbnail in redux store\n if (snapshot) {\n this.props.onNewThumbnail(snapshot);\n }\n }\n render () {\n const { error, videoSource, sliderMinRange, sliderMaxRange, sliderValue, totalMinutes, totalSeconds } = this.state;\n return (\n
\n \n \n {\n sliderValue ? (\n
\n
\n 0'00\"\n {totalMinutes}'{totalSeconds}\"\n
\n
\n \n
\n
\n ) : (\n

loading...

\n )\n }\n { error ? (\n

{error}

\n ) : (\n

Use slider to set thumbnail

\n )}\n
\n );\n }\n}\n\nexport default PublishThumbnailInput;\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/PublishThumbnailInput/view.jsx","import {connect} from 'react-redux';\nimport {updateMetadata, toggleMetadataInputs} from 'actions/publish';\nimport View from './view';\n\nconst mapStateToProps = ({ publish }) => {\n return {\n showMetadataInputs: publish.showMetadataInputs,\n description : publish.metadata.description,\n license : publish.metadata.license,\n nsfw : publish.metadata.nsfw,\n };\n};\n\nconst mapDispatchToProps = dispatch => {\n return {\n onMetadataChange: (name, value) => {\n dispatch(updateMetadata(name, value));\n },\n onToggleMetadataInputs: (value) => {\n dispatch(toggleMetadataInputs(value));\n },\n };\n};\n\nexport default connect(mapStateToProps, mapDispatchToProps)(View);\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/PublishMetadataInputs/index.js","import React from 'react';\nimport ExpandingTextArea from 'components/ExpandingTextArea';\n\nclass PublishMetadataInputs extends React.Component {\n constructor (props) {\n super(props);\n this.toggleShowInputs = this.toggleShowInputs.bind(this);\n this.handleInput = this.handleInput.bind(this);\n this.handleSelect = this.handleSelect.bind(this);\n }\n toggleShowInputs () {\n this.props.onToggleMetadataInputs(!this.props.showMetadataInputs);\n }\n handleInput (event) {\n const target = event.target;\n const value = target.type === 'checkbox' ? target.checked : target.value;\n const name = target.name;\n this.props.onMetadataChange(name, value);\n }\n handleSelect (event) {\n const name = event.target.name;\n const selectedOption = event.target.selectedOptions[0].value;\n this.props.onMetadataChange(name, selectedOption);\n }\n render () {\n return (\n
\n {this.props.showMetadataInputs && (\n
\n
\n
\n \n
\n \n
\n
\n\n
\n
\n \n
\n \n
\n
\n\n
\n
\n \n
\n \n
\n
\n
\n )}\n \n
\n );\n }\n}\n\nexport default PublishMetadataInputs;\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/PublishMetadataInputs/view.jsx","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\n\nclass ExpandingTextarea extends Component {\n constructor (props) {\n super(props);\n this._handleChange = this._handleChange.bind(this);\n }\n componentDidMount () {\n this.adjustTextarea({});\n }\n _handleChange (event) {\n const { onChange } = this.props;\n if (onChange) onChange(event);\n this.adjustTextarea(event);\n }\n adjustTextarea ({ target = this.el }) {\n target.style.height = 0;\n target.style.height = `${target.scrollHeight}px`;\n }\n render () {\n const { ...rest } = this.props;\n return (\n this.el = x}\n onChange={this._handleChange}\n />\n );\n }\n}\n\nExpandingTextarea.propTypes = {\n onChange: PropTypes.func,\n};\n\nexport default ExpandingTextarea;\n\n\n\n// WEBPACK FOOTER //\n// ./react/components/ExpandingTextArea/index.jsx","import {connect} from 'react-redux';\nimport {setPublishInChannel, updateSelectedChannel, updateError} from 'actions/publish';\nimport View from './view';\n\nconst mapStateToProps = ({ channel, publish }) => {\n return {\n loggedInChannelName: channel.loggedInChannel.name,\n publishInChannel : publish.publishInChannel,\n selectedChannel : publish.selectedChannel,\n channelError : publish.error.channel,\n };\n};\n\nconst mapDispatchToProps = dispatch => {\n return {\n onPublishInChannelChange: (value) => {\n dispatch(updateError('channel', null));\n dispatch(setPublishInChannel(value));\n },\n onChannelSelect: (value) => {\n dispatch(updateError('channel', null));\n dispatch(updateSelectedChannel(value));\n },\n };\n};\n\nexport default connect(mapStateToProps, mapDispatchToProps)(View);\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/ChannelSelect/index.js","import React from 'react';\nimport ChannelLoginForm from 'containers/ChannelLoginForm';\nimport ChannelCreateForm from 'containers/ChannelCreateForm';\nimport * as states from 'constants/publish_channel_select_states';\n\nclass ChannelSelect extends React.Component {\n constructor (props) {\n super(props);\n this.toggleAnonymousPublish = this.toggleAnonymousPublish.bind(this);\n this.handleSelection = this.handleSelection.bind(this);\n }\n toggleAnonymousPublish (event) {\n const value = event.target.value;\n if (value === 'anonymous') {\n this.props.onPublishInChannelChange(false);\n } else {\n this.props.onPublishInChannelChange(true);\n }\n }\n handleSelection (event) {\n const selectedOption = event.target.selectedOptions[0].value;\n this.props.onChannelSelect(selectedOption);\n }\n render () {\n return (\n
\n
\n
\n \n \n
\n
\n \n \n
\n { this.props.channelError ? (\n

{this.props.channelError}

\n ) : (\n

Publish anonymously or in a channel

\n )}\n
\n { this.props.publishInChannel && (\n
\n
\n \n
\n \n
\n { (this.props.selectedChannel === states.LOGIN) && }\n { (this.props.selectedChannel === states.CREATE) && }\n
\n )}\n
\n );\n }\n}\n\nexport default ChannelSelect;\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/ChannelSelect/view.jsx","import React from 'react';\nimport request from 'utils/request';\n\nclass ChannelLoginForm extends React.Component {\n constructor (props) {\n super(props);\n this.state = {\n error : null,\n name : '',\n password: '',\n };\n this.handleInput = this.handleInput.bind(this);\n this.loginToChannel = this.loginToChannel.bind(this);\n }\n handleInput (event) {\n const name = event.target.name;\n const value = event.target.value;\n this.setState({[name]: value});\n }\n loginToChannel (event) {\n event.preventDefault();\n const params = {\n method : 'POST',\n body : JSON.stringify({username: this.state.name, password: this.state.password}),\n headers: new Headers({\n 'Content-Type': 'application/json',\n }),\n credentials: 'include',\n };\n request('login', params)\n .then(({success, channelName, shortChannelId, channelClaimId, message}) => {\n if (success) {\n this.props.onChannelLogin(channelName, shortChannelId, channelClaimId);\n } else {\n this.setState({'error': message});\n };\n })\n .catch(error => {\n if (error.message) {\n this.setState({'error': error.message});\n } else {\n this.setState({'error': error});\n }\n });\n }\n render () {\n return (\n
\n
\n
\n \n
\n
\n @\n \n
\n
\n
\n
\n
\n \n
\n
\n \n
\n
\n
\n { this.state.error ? (\n

{this.state.error}

\n ) : (\n

Enter the name and password for your channel

\n )}\n
\n \n
\n
\n );\n }\n}\n\nexport default ChannelLoginForm;\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/ChannelLoginForm/view.jsx","import React from 'react';\nimport ProgressBar from 'components/ProgressBar';\nimport request from 'utils/request';\n\nclass ChannelCreateForm extends React.Component {\n constructor (props) {\n super(props);\n this.state = {\n error : null,\n channel : '',\n password: '',\n status : null,\n };\n this.handleChannelInput = this.handleChannelInput.bind(this);\n this.handleInput = this.handleInput.bind(this);\n this.createChannel = this.createChannel.bind(this);\n }\n cleanseChannelInput (input) {\n input = input.replace(/\\s+/g, '-'); // replace spaces with dashes\n input = input.replace(/[^A-Za-z0-9-]/g, ''); // remove all characters that are not A-Z, a-z, 0-9, or '-'\n return input;\n }\n handleChannelInput (event) {\n let value = event.target.value;\n value = this.cleanseChannelInput(value);\n this.setState({channel: value});\n if (value) {\n this.updateIsChannelAvailable(value);\n } else {\n this.setState({error: 'Please enter a channel name'});\n }\n }\n handleInput (event) {\n const name = event.target.name;\n const value = event.target.value;\n this.setState({[name]: value});\n }\n updateIsChannelAvailable (channel) {\n const channelWithAtSymbol = `@${channel}`;\n request(`/api/channel/availability/${channelWithAtSymbol}`)\n .then(isAvailable => {\n if (isAvailable) {\n this.setState({'error': null});\n } else {\n this.setState({'error': 'That channel has already been claimed'});\n }\n })\n .catch((error) => {\n this.setState({'error': error.message});\n });\n }\n checkIsChannelAvailable (channel) {\n const channelWithAtSymbol = `@${channel}`;\n return new Promise((resolve, reject) => {\n request(`/api/channel/availability/${channelWithAtSymbol}`)\n .then(isAvailable => {\n if (!isAvailable) {\n return reject(new Error('That channel has already been claimed'));\n }\n resolve();\n })\n .catch((error) => {\n reject(error);\n });\n });\n }\n checkIsPasswordProvided () {\n const password = this.state.password;\n return new Promise((resolve, reject) => {\n if (!password || password.length < 1) {\n return reject(new Error('Please provide a password'));\n }\n resolve();\n });\n }\n makePublishChannelRequest (username, password) {\n const params = {\n method : 'POST',\n body : JSON.stringify({username, password}),\n headers: new Headers({\n 'Content-Type': 'application/json',\n }),\n credentials: 'include',\n };\n return new Promise((resolve, reject) => {\n request('/signup', params)\n .then(result => {\n return resolve(result);\n })\n .catch(error => {\n reject(new Error(`Unfortunately, we encountered an error while creating your channel. Please let us know in Discord! ${error.message}`));\n });\n });\n }\n createChannel (event) {\n event.preventDefault();\n this.checkIsPasswordProvided()\n .then(() => {\n return this.checkIsChannelAvailable(this.state.channel, this.state.password);\n })\n .then(() => {\n this.setState({status: 'We are publishing your new channel. Sit tight...'});\n return this.makePublishChannelRequest(this.state.channel, this.state.password);\n })\n .then(result => {\n this.setState({status: null});\n this.props.onChannelLogin(result.channelName, result.shortChannelId, result.channelClaimId);\n })\n .catch((error) => {\n this.setState({'error': error.message, status: null});\n });\n }\n render () {\n return (\n
\n { !this.state.status ? (\n
\n
\n
\n \n
\n
\n @\n \n { (this.state.channel && !this.state.error) && {'\\u2713'} }\n { this.state.error && {'\\u2716'} }\n
\n
\n
\n
\n
\n \n
\n
\n \n
\n
\n
\n {this.state.error ? (\n

{this.state.error}

\n ) : (\n

Choose a name and password for your channel

\n )}\n
\n \n
\n
\n ) : (\n
\n

{this.state.status}

\n \n
\n )}\n
\n );\n }\n}\n\nexport default ChannelCreateForm;\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/ChannelCreateForm/view.jsx","import React from 'react';\n\nconst ActiveStatusBar = () => {\n return | ;\n};\n\nexport default ActiveStatusBar;\n\n\n\n// WEBPACK FOOTER //\n// ./react/components/ActiveStatusBar/index.jsx","import React from 'react';\n\nconst InactiveStatusBar = () => {\n return | ;\n};\n\nexport default InactiveStatusBar;\n\n\n\n// WEBPACK FOOTER //\n// ./react/components/InactiveStatusBar/index.jsx","import {connect} from 'react-redux';\nimport {clearFile} from 'actions/publish';\nimport View from './view';\n\nconst mapStateToProps = ({ publish }) => {\n return {\n status : publish.status.status,\n message: publish.status.message,\n };\n};\n\nconst mapDispatchToProps = {\n clearFile,\n};\n\nexport default connect(mapStateToProps, mapDispatchToProps)(View);\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/PublishStatus/index.js","import React from 'react';\nimport ProgressBar from 'components/ProgressBar';\nimport * as publishStates from 'constants/publish_claim_states';\n\nclass PublishStatus extends React.Component {\n render () {\n const { status, message, clearFile } = this.props;\n return (\n
\n {status === publishStates.LOAD_START &&\n
\n

File is loading to server

\n

0%

\n
\n }\n {status === publishStates.LOADING &&\n
\n
\n

File is loading to server

\n

{message}

\n
\n
\n }\n {status === publishStates.PUBLISHING &&\n
\n

Upload complete. Your file is now being published on the blockchain...

\n \n

Curious what magic is happening here? Learn more.

\n
\n }\n {status === publishStates.SUCCESS &&\n
\n

Your publish is complete! You are being redirected to it now.

\n

If you are not automatically redirected, click here.

\n
\n }\n {status === publishStates.FAILED &&\n
\n

Something went wrong...

\n

{message}

\n

For help, post the above error text in the #speech channel on the lbry discord

\n \n
\n }\n
\n );\n }\n};\n\nexport default PublishStatus;\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/PublishStatus/view.jsx","export const LOAD_START = 'LOAD_START';\nexport const LOADING = 'LOADING';\nexport const PUBLISHING = 'PUBLISHING';\nexport const SUCCESS = 'SUCCESS';\nexport const FAILED = 'FAILED';\n\n\n\n// WEBPACK FOOTER //\n// ./react/constants/publish_claim_states.js","import React from 'react';\nimport NavBar from 'containers/NavBar';\nimport SEO from 'components/SEO';\n\nclass AboutPage extends React.Component {\n render () {\n return (\n
\n \n \n
\n
\n
\n

Spee.ch is an open-source project. Please contribute to the existing site, or fork it and make your own.

\n

TWITTER

\n

GITHUB

\n

DISCORD CHANNEL

\n

DOCUMENTATION

\n
\n
\n
\n

Spee.ch is a media-hosting site that reads from and publishes content to the LBRY blockchain.

\n

Spee.ch is a hosting service, but with the added benefit that it stores your content on a decentralized network of computers -- the LBRY network. This means that your images are stored in multiple locations without a single point of failure.

\n

Contribute

\n

If you have an idea for your own spee.ch-like site on top of LBRY, fork our github repo and go to town!

\n

If you want to improve spee.ch, join our discord channel or solve one of our github issues.

\n
\n
\n
\n
\n );\n }\n};\n\nexport default AboutPage;\n\n\n\n// WEBPACK FOOTER //\n// ./react/components/AboutPage/index.jsx","import {connect} from 'react-redux';\nimport View from './view';\n\nconst mapStateToProps = ({ channel }) => {\n return {\n loggedInChannelName: channel.loggedInChannel.name,\n };\n};\n\nexport default connect(mapStateToProps, null)(View);\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/LoginPage/index.js","import React from 'react';\nimport { withRouter } from 'react-router-dom';\nimport SEO from 'components/SEO';\nimport NavBar from 'containers/NavBar';\nimport ChannelLoginForm from 'containers/ChannelLoginForm';\nimport ChannelCreateForm from 'containers/ChannelCreateForm';\n\nclass LoginPage extends React.Component {\n componentWillReceiveProps (newProps) {\n // re-route the user to the homepage if the user is logged in\n if (newProps.loggedInChannelName !== this.props.loggedInChannelName) {\n this.props.history.push(`/`);\n }\n }\n render () {\n return (\n
\n \n \n
\n
\n
\n

Channels allow you to publish and group content under an identity. You can create a channel for yourself, or share one with like-minded friends. You can create 1 channel, or 100, so whether you're documenting important events, or making a public repository for cat gifs (password: '1234'), try creating a channel for it!

\n
\n
\n
\n

Log in to an existing channel:

\n \n

Create a brand new channel:

\n \n
\n
\n
\n
\n );\n }\n};\n\nexport default withRouter(LoginPage);\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/LoginPage/view.jsx","import { connect } from 'react-redux';\nimport { onHandleShowPageUri } from 'actions/show';\nimport View from './view';\n\nconst mapStateToProps = ({ show }) => {\n return {\n error : show.request.error,\n requestType: show.request.type,\n };\n};\n\nconst mapDispatchToProps = {\n onHandleShowPageUri,\n};\n\nexport default connect(mapStateToProps, mapDispatchToProps)(View);\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/ShowPage/index.js","import React from 'react';\nimport ErrorPage from 'components/ErrorPage';\nimport ShowAssetLite from 'containers/ShowAssetLite';\nimport ShowAssetDetails from 'containers/ShowAssetDetails';\nimport ShowChannel from 'containers/ShowChannel';\n\nimport { CHANNEL, ASSET_LITE, ASSET_DETAILS } from 'constants/show_request_types';\n\nclass ShowPage extends React.Component {\n componentDidMount () {\n this.props.onHandleShowPageUri(this.props.match.params);\n }\n componentWillReceiveProps (nextProps) {\n if (nextProps.match.params !== this.props.match.params) {\n this.props.onHandleShowPageUri(nextProps.match.params);\n }\n }\n render () {\n const { error, requestType } = this.props;\n if (error) {\n return (\n \n );\n }\n switch (requestType) {\n case CHANNEL:\n return ;\n case ASSET_LITE:\n return ;\n case ASSET_DETAILS:\n return ;\n default:\n return

loading...

;\n }\n }\n};\n\nexport default ShowPage;\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/ShowPage/view.jsx","import { connect } from 'react-redux';\nimport View from './view';\n\nconst mapStateToProps = ({ show }) => {\n // select request info\n const requestId = show.request.id;\n // select asset info\n let asset;\n const request = show.requestList[requestId] || null;\n const assetList = show.assetList;\n if (request && assetList) {\n const assetKey = request.key; // note: just store this in the request\n asset = assetList[assetKey] || null;\n };\n // return props\n return {\n asset,\n };\n};\n\nexport default connect(mapStateToProps, null)(View);\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/ShowAssetLite/index.js","import React from 'react';\nimport SEO from 'components/SEO';\nimport { Link } from 'react-router-dom';\nimport AssetDisplay from 'containers/AssetDisplay';\n\nclass ShowLite extends React.Component {\n render () {\n const { asset } = this.props;\n if (asset) {\n const { name, claimId } = asset.claimData;\n return (\n
\n \n \n hosted\n via Spee.ch\n
\n );\n }\n return (\n
\n

loading asset data...

\n
\n );\n }\n};\n\nexport default ShowLite;\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/ShowAssetLite/view.jsx","import React from 'react';\nimport ProgressBar from 'components/ProgressBar';\nimport { LOCAL_CHECK, UNAVAILABLE, ERROR, AVAILABLE } from 'constants/asset_display_states';\n\nclass AssetDisplay extends React.Component {\n componentDidMount () {\n const { asset: { claimData: { name, claimId } } } = this.props;\n this.props.onFileRequest(name, claimId);\n }\n render () {\n const { status, error, asset: { claimData: { name, claimId, contentType, fileExt, thumbnail } } } = this.props;\n return (\n
\n {(status === LOCAL_CHECK) &&\n
\n

Checking to see if Spee.ch has your asset locally...

\n
\n }\n {(status === UNAVAILABLE) &&\n
\n

Sit tight, we're searching the LBRY blockchain for your asset!

\n \n

Curious what magic is happening here? Learn more.

\n
\n }\n {(status === ERROR) &&\n
\n

Unfortunately, we couldn't download your asset from LBRY. You can help us out by sharing the below error message in the LBRY discord.

\n

{error}

\n
\n }\n {(status === AVAILABLE) &&\n (() => {\n switch (contentType) {\n case 'image/jpeg':\n case 'image/jpg':\n case 'image/png':\n return (\n \n );\n case 'image/gif':\n return (\n \n );\n case 'video/mp4':\n return (\n \n );\n default:\n return (\n

Unsupported file type

\n );\n }\n })()\n }\n
\n );\n }\n};\n\nexport default AssetDisplay;\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/AssetDisplay/view.jsx","import { connect } from 'react-redux';\nimport View from './view';\n\nconst mapStateToProps = ({ show }) => {\n // select request info\n const requestId = show.request.id;\n // select asset info\n let asset;\n const request = show.requestList[requestId] || null;\n const assetList = show.assetList;\n if (request && assetList) {\n const assetKey = request.key; // note: just store this in the request\n asset = assetList[assetKey] || null;\n };\n // return props\n return {\n asset,\n };\n};\n\nexport default connect(mapStateToProps, null)(View);\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/ShowAssetDetails/index.js","import React from 'react';\nimport SEO from 'components/SEO';\nimport NavBar from 'containers/NavBar';\nimport ErrorPage from 'components/ErrorPage';\nimport AssetTitle from 'containers/AssetTitle';\nimport AssetDisplay from 'containers/AssetDisplay';\nimport AssetInfo from 'containers/AssetInfo';\n\nclass ShowAssetDetails extends React.Component {\n render () {\n const { asset } = this.props;\n if (asset) {\n const { claimData: { name } } = asset;\n return (\n
\n \n \n
\n
\n \n
\n
\n
\n \n
\n
\n
\n \n
\n
\n
\n }\n
\n );\n };\n return (\n \n );\n }\n};\n\nexport default ShowAssetDetails;\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/ShowAssetDetails/view.jsx","import { connect } from 'react-redux';\nimport View from './view';\nimport { selectAsset } from 'selectors/show';\n\nconst mapStateToProps = ({ show }) => {\n const { claimData: { title } } = selectAsset(show);\n return {\n title,\n };\n};\n\nexport default connect(mapStateToProps, null)(View);\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/AssetTitle/index.js","import React from 'react';\n\nconst AssetTitle = ({ title }) => {\n return (\n
\n {title}\n
\n );\n};\n\nexport default AssetTitle;\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/AssetTitle/view.jsx","import { connect } from 'react-redux';\nimport View from './view';\nimport { selectAsset } from 'selectors/show';\n\nconst mapStateToProps = ({ show }) => {\n // select asset\n const asset = selectAsset(show);\n // return props\n return {\n asset,\n };\n};\n\nexport default connect(mapStateToProps, null)(View);\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/AssetInfo/index.js","import React from 'react';\nimport { Link } from 'react-router-dom';\n\nclass AssetInfo extends React.Component {\n constructor (props) {\n super(props);\n this.copyToClipboard = this.copyToClipboard.bind(this);\n }\n copyToClipboard (event) {\n var elementToCopy = event.target.dataset.elementtocopy;\n var element = document.getElementById(elementToCopy);\n element.select();\n try {\n document.execCommand('copy');\n } catch (err) {\n this.setState({error: 'Oops, unable to copy'});\n }\n }\n render () {\n const { asset: { shortId, claimData : { channelName, certificateId, description, name, claimId, fileExt, contentType, thumbnail, host } } } = this.props;\n return (\n
\n {channelName &&\n
\n
\n Channel:\n
\n
\n {channelName}\n
\n
\n }\n\n {description &&\n
\n {description}\n
\n }\n\n
\n
\n
\n Share:\n
\n
\n \n twitter\n facebook\n tumblr\n reddit\n
\n
\n
\n
\n\n
\n \n );\n }\n};\n\nexport default AssetInfo;\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/AssetInfo/view.jsx","import { connect } from 'react-redux';\nimport View from './view';\n\nconst mapStateToProps = ({ show }) => {\n // select request info\n const requestId = show.request.id;\n // select request\n const previousRequest = show.requestList[requestId] || null;\n // select channel\n let channel;\n if (previousRequest) {\n const channelKey = previousRequest.key;\n channel = show.channelList[channelKey] || null;\n }\n return {\n channel,\n };\n};\n\nexport default connect(mapStateToProps, null)(View);\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/ShowChannel/index.js","import React from 'react';\nimport SEO from 'components/SEO';\nimport ErrorPage from 'components/ErrorPage';\nimport NavBar from 'containers/NavBar';\nimport ChannelClaimsDisplay from 'containers/ChannelClaimsDisplay';\n\nclass ShowChannel extends React.Component {\n render () {\n const { channel } = this.props;\n if (channel) {\n const { name, longId, shortId } = channel;\n return (\n
\n \n \n
\n
\n

channel name: {name}

\n

full channel id: {longId}

\n

short channel id: {shortId}

\n
\n
\n \n
\n
\n
\n );\n };\n return (\n \n );\n }\n};\n\nexport default ShowChannel;\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/ShowChannel/view.jsx","import { connect } from 'react-redux';\nimport { onUpdateChannelClaims } from 'actions/show';\nimport View from './view';\n\nconst mapStateToProps = ({ show }) => {\n // select channel key\n const request = show.requestList[show.request.id];\n const channelKey = request.key;\n // select channel claims\n const channel = show.channelList[channelKey] || null;\n // return props\n return {\n channelKey,\n channel,\n };\n};\n\nconst mapDispatchToProps = {\n onUpdateChannelClaims,\n};\n\nexport default connect(mapStateToProps, mapDispatchToProps)(View);\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/ChannelClaimsDisplay/index.js","import React from 'react';\nimport AssetPreview from 'components/AssetPreview';\n\nclass ChannelClaimsDisplay extends React.Component {\n constructor (props) {\n super(props);\n this.showNextResultsPage = this.showNextResultsPage.bind(this);\n this.showPreviousResultsPage = this.showPreviousResultsPage.bind(this);\n }\n showPreviousResultsPage () {\n const { channel: { claimsData: { currentPage } } } = this.props;\n const previousPage = parseInt(currentPage) - 1;\n this.showNewPage(previousPage);\n }\n showNextResultsPage () {\n const { channel: { claimsData: { currentPage } } } = this.props;\n const nextPage = parseInt(currentPage) + 1;\n this.showNewPage(nextPage);\n }\n showNewPage (page) {\n const { channelKey, channel: { name, longId } } = this.props;\n this.props.onUpdateChannelClaims(channelKey, name, longId, page);\n }\n render () {\n const { channel: { claimsData: { claims, currentPage, totalPages } } } = this.props;\n return (\n
\n {(claims.length > 0) ? (\n
\n {claims.map((claim, index) => )}\n
\n {(currentPage > 1) &&\n \n }\n {(currentPage < totalPages) &&\n \n }\n
\n
\n ) : (\n

There are no claims in this channel

\n )}\n
\n );\n }\n};\n\nexport default ChannelClaimsDisplay;\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/ChannelClaimsDisplay/view.jsx","import React from 'react';\nimport { Link } from 'react-router-dom';\nconst { claim: { defaultThumbnail } } = require('../../../config/speechConfig.js');\n\nconst AssetPreview = ({ claimData: { name, claimId, fileExt, contentType, thumbnail } }) => {\n const directSourceLink = `${claimId}/${name}.${fileExt}`;\n const showUrlLink = `/${claimId}/${name}`;\n return (\n
\n \n {(() => {\n switch (contentType) {\n case 'image/jpeg':\n case 'image/jpg':\n case 'image/png':\n case 'image/gif':\n return (\n \n );\n case 'video/mp4':\n return (\n \n );\n default:\n return (\n

unsupported file type

\n );\n }\n })()}\n \n
\n );\n};\n\nexport default AssetPreview;\n\n\n\n// WEBPACK FOOTER //\n// ./react/components/AssetPreview/index.jsx","import React from 'react';\nimport NavBar from 'containers/NavBar';\nimport Helmet from 'react-helmet';\nconst { site: { title, host } } = require('../../../config/speechConfig.js');\n\nclass FourOhForPage extends React.Component {\n render () {\n return (\n
\n \n {title} - 404\n \n \n \n
\n

404

\n

That page does not exist

\n
\n
\n );\n }\n};\n\nexport default FourOhForPage;\n\n\n\n// WEBPACK FOOTER //\n// ./react/components/FourOhFourPage/index.jsx","const { sendGAServeEvent } = require('../helpers/googleAnalytics');\nconst { determineResponseType, flipClaimNameAndIdForBackwardsCompatibility, logRequestData, getClaimIdAndServeAsset } = require('../helpers/serveHelpers.js');\nconst lbryUri = require('../helpers/lbryUri.js');\nconst handleShowRender = require('../helpers/handleShowRender.jsx');\nconst SERVE = 'SERVE';\n\nmodule.exports = (app) => {\n // route to serve a specific asset using the channel or claim id\n app.get('/:identifier/:claim', (req, res) => {\n const { headers, ip, originalUrl, params } = req;\n // decide if this is a show request\n let hasFileExtension;\n try {\n ({ hasFileExtension } = lbryUri.parseModifier(params.claim));\n } catch (error) {\n return res.status(400).json({success: false, message: error.message});\n }\n let responseType = determineResponseType(hasFileExtension, headers);\n if (responseType !== SERVE) {\n return handleShowRender(req, res);\n }\n // handle serve request\n // send google analytics\n sendGAServeEvent(headers, ip, originalUrl);\n // parse the claim\n let claimName;\n try {\n ({ claimName } = lbryUri.parseClaim(params.claim));\n } catch (error) {\n return res.status(400).json({success: false, message: error.message});\n }\n // parse the identifier\n let isChannel, channelName, channelClaimId, claimId;\n try {\n ({ isChannel, channelName, channelClaimId, claimId } = lbryUri.parseIdentifier(params.identifier));\n } catch (error) {\n return res.status(400).json({success: false, message: error.message});\n }\n if (!isChannel) {\n [claimId, claimName] = flipClaimNameAndIdForBackwardsCompatibility(claimId, claimName);\n }\n // log the request data for debugging\n logRequestData(responseType, claimName, channelName, claimId);\n // get the claim Id and then serve the asset\n getClaimIdAndServeAsset(channelName, channelClaimId, claimName, claimId, originalUrl, ip, res);\n });\n // route to serve the winning asset at a claim or a channel page\n app.get('/:claim', (req, res) => {\n const { headers, ip, originalUrl, params } = req;\n // decide if this is a show request\n let hasFileExtension;\n try {\n ({ hasFileExtension } = lbryUri.parseModifier(params.claim));\n } catch (error) {\n return res.status(400).json({success: false, message: error.message});\n }\n let responseType = determineResponseType(hasFileExtension, headers);\n if (responseType !== SERVE) {\n return handleShowRender(req, res);\n }\n // handle serve request\n // send google analytics\n sendGAServeEvent(headers, ip, originalUrl);\n // parse the claim\n let claimName;\n try {\n ({claimName} = lbryUri.parseClaim(params.claim));\n } catch (error) {\n return res.status(400).json({success: false, message: error.message});\n }\n // log the request data for debugging\n logRequestData(responseType, claimName, null, null);\n // get the claim Id and then serve the asset\n getClaimIdAndServeAsset(null, null, claimName, null, originalUrl, ip, res);\n });\n};\n\n\n\n// WEBPACK FOOTER //\n// ./routes/serve-routes.js","const logger = require('winston');\nconst { getClaimId, getLocalFileRecord } = require('../controllers/serveController.js');\nconst { handleErrorResponse } = require('../helpers/errorHandlers.js');\n\nconst SERVE = 'SERVE';\nconst SHOW = 'SHOW';\nconst NO_FILE = 'NO_FILE';\nconst NO_CHANNEL = 'NO_CHANNEL';\nconst NO_CLAIM = 'NO_CLAIM';\n\nfunction clientAcceptsHtml ({accept}) {\n return accept && accept.match(/text\\/html/);\n};\n\nfunction requestIsFromBrowser (headers) {\n return headers['user-agent'] && headers['user-agent'].match(/Mozilla/);\n};\n\nfunction clientWantsAsset ({accept, range}) {\n const imageIsWanted = accept && accept.match(/image\\/.*/) && !accept.match(/text\\/html/) && !accept.match(/text\\/\\*/);\n const videoIsWanted = accept && range;\n return imageIsWanted || videoIsWanted;\n};\n\nfunction isValidClaimId (claimId) {\n return ((claimId.length === 40) && !/[^A-Za-z0-9]/g.test(claimId));\n};\n\nfunction isValidShortId (claimId) {\n return claimId.length === 1; // it should really evaluate the short url itself\n};\n\nfunction isValidShortIdOrClaimId (input) {\n return (isValidClaimId(input) || isValidShortId(input));\n};\n\nfunction serveAssetToClient (claimId, name, res) {\n return getLocalFileRecord(claimId, name)\n .then(fileRecord => {\n // check that a local record was found\n if (fileRecord === NO_FILE) {\n return res.status(307).redirect(`/api/claim/get/${name}/${claimId}`);\n }\n // serve the file\n const {filePath, fileType} = fileRecord;\n logger.verbose(`serving file: ${filePath}`);\n const sendFileOptions = {\n headers: {\n 'X-Content-Type-Options': 'nosniff',\n 'Content-Type' : fileType || 'image/jpeg',\n },\n };\n res.status(200).sendFile(filePath, sendFileOptions);\n })\n .catch(error => {\n throw error;\n });\n};\n\nmodule.exports = {\n getClaimIdAndServeAsset (channelName, channelClaimId, claimName, claimId, originalUrl, ip, res) {\n // get the claim Id and then serve the asset\n getClaimId(channelName, channelClaimId, claimName, claimId)\n .then(fullClaimId => {\n if (fullClaimId === NO_CLAIM) {\n return res.status(404).json({success: false, message: 'no claim id could be found'});\n } else if (fullClaimId === NO_CHANNEL) {\n return res.status(404).json({success: false, message: 'no channel id could be found'});\n }\n serveAssetToClient(fullClaimId, claimName, res);\n // postToStats(responseType, originalUrl, ip, claimName, fullClaimId, 'success');\n })\n .catch(error => {\n handleErrorResponse(originalUrl, ip, error, res);\n // postToStats(responseType, originalUrl, ip, claimName, fullClaimId, 'fail');\n });\n },\n determineResponseType (hasFileExtension, headers) {\n let responseType;\n if (hasFileExtension) {\n responseType = SERVE; // assume a serve request if file extension is present\n if (clientAcceptsHtml(headers)) { // if the request comes from a browser, change it to a show request\n responseType = SHOW;\n }\n } else {\n responseType = SHOW;\n if (clientWantsAsset(headers) && requestIsFromBrowser(headers)) { // this is in case someone embeds a show url\n logger.debug('Show request came from browser but wants an image/video. Changing response to serve...');\n responseType = SERVE;\n }\n }\n return responseType;\n },\n flipClaimNameAndIdForBackwardsCompatibility (identifier, name) {\n // this is a patch for backwards compatability with '/name/claim_id' url format\n if (isValidShortIdOrClaimId(name) && !isValidShortIdOrClaimId(identifier)) {\n const tempName = name;\n name = identifier;\n identifier = tempName;\n }\n return [identifier, name];\n },\n logRequestData (responseType, claimName, channelName, claimId) {\n logger.debug('responseType ===', responseType);\n logger.debug('claim name === ', claimName);\n logger.debug('channel name ===', channelName);\n logger.debug('claim id ===', claimId);\n },\n};\n\n\n\n// WEBPACK FOOTER //\n// ./helpers/serveHelpers.js","const logger = require('winston');\n\nmodule.exports = {\n REGEXP_INVALID_CLAIM : /[^A-Za-z0-9-]/g,\n REGEXP_INVALID_CHANNEL: /[^A-Za-z0-9-@]/g,\n REGEXP_ADDRESS : /^b(?=[^0OIl]{32,33})[0-9A-Za-z]{32,33}$/,\n CHANNEL_CHAR : '@',\n parseIdentifier : function (identifier) {\n logger.debug('parsing identifier:', identifier);\n const componentsRegex = new RegExp(\n '([^:$#/]*)' + // value (stops at the first separator or end)\n '([:$#]?)([^/]*)' // modifier separator, modifier (stops at the first path separator or end)\n );\n const [proto, value, modifierSeperator, modifier] = componentsRegex\n .exec(identifier)\n .map(match => match || null);\n logger.debug(`${proto}, ${value}, ${modifierSeperator}, ${modifier}`);\n\n // Validate and process name\n if (!value) {\n throw new Error(`Check your url. No channel name provided before \"${modifierSeperator}\"`);\n }\n const isChannel = value.startsWith(module.exports.CHANNEL_CHAR);\n const channelName = isChannel ? value : null;\n let claimId;\n if (isChannel) {\n if (!channelName) {\n throw new Error('No channel name after @.');\n }\n const nameBadChars = (channelName).match(module.exports.REGEXP_INVALID_CHANNEL);\n if (nameBadChars) {\n throw new Error(`Invalid characters in channel name: ${nameBadChars.join(', ')}.`);\n }\n } else {\n claimId = value;\n }\n\n // Validate and process modifier\n let channelClaimId;\n if (modifierSeperator) {\n if (!modifier) {\n throw new Error(`No modifier provided after separator \"${modifierSeperator}\"`);\n }\n\n if (modifierSeperator === ':') {\n channelClaimId = modifier;\n } else {\n throw new Error(`The \"${modifierSeperator}\" modifier is not currently supported`);\n }\n }\n return {\n isChannel,\n channelName,\n channelClaimId,\n claimId,\n };\n },\n parseClaim: function (claim) {\n logger.debug('parsing name:', claim);\n const componentsRegex = new RegExp(\n '([^:$#/.]*)' + // name (stops at the first modifier)\n '([:$#.]?)([^/]*)' // modifier separator, modifier (stops at the first path separator or end)\n );\n const [proto, claimName, modifierSeperator, modifier] = componentsRegex\n .exec(claim)\n .map(match => match || null);\n logger.debug(`${proto}, ${claimName}, ${modifierSeperator}, ${modifier}`);\n\n // Validate and process name\n if (!claimName) {\n throw new Error('No claim name provided before .');\n }\n const nameBadChars = (claimName).match(module.exports.REGEXP_INVALID_CLAIM);\n if (nameBadChars) {\n throw new Error(`Invalid characters in claim name: ${nameBadChars.join(', ')}.`);\n }\n // Validate and process modifier\n if (modifierSeperator) {\n if (!modifier) {\n throw new Error(`No file extension provided after separator ${modifierSeperator}.`);\n }\n if (modifierSeperator !== '.') {\n throw new Error(`The ${modifierSeperator} modifier is not supported in the claim name`);\n }\n }\n // return results\n return {\n claimName,\n };\n },\n parseModifier: function (claim) {\n logger.debug('parsing modifier:', claim);\n const componentsRegex = new RegExp(\n '([^:$#/.]*)' + // name (stops at the first modifier)\n '([:$#.]?)([^/]*)' // modifier separator, modifier (stops at the first path separator or end)\n );\n const [proto, claimName, modifierSeperator, modifier] = componentsRegex\n .exec(claim)\n .map(match => match || null);\n logger.debug(`${proto}, ${claimName}, ${modifierSeperator}, ${modifier}`);\n // Validate and process modifier\n let hasFileExtension = false;\n if (modifierSeperator) {\n hasFileExtension = true;\n }\n return {\n hasFileExtension,\n };\n },\n};\n\n\n\n// WEBPACK FOOTER //\n// ./helpers/lbryUri.js","import React from 'react';\nimport { renderToString } from 'react-dom/server';\nimport { createStore, applyMiddleware } from 'redux';\nimport Reducer from '../react/reducers';\nimport { Provider } from 'react-redux';\nimport { StaticRouter } from 'react-router-dom';\nimport GAListener from '../react/components/GAListener';\nimport App from '../react/app';\nimport renderFullPage from './renderFullPage';\nimport createSagaMiddleware from 'redux-saga';\nimport { call } from 'redux-saga/effects';\nimport { handleShowPageUri } from '../react/sagas/show_uri';\nimport { onHandleShowPageUri } from '../react/actions/show';\n\nimport Helmet from 'react-helmet';\n\nconst returnSagaWithParams = (saga, params) => {\n return function * () {\n yield call(saga, params);\n };\n};\n\nmodule.exports = (req, res) => {\n let context = {};\n\n // create and apply middleware\n const sagaMiddleware = createSagaMiddleware();\n const middleware = applyMiddleware(sagaMiddleware);\n\n // create a new Redux store instance\n const store = createStore(Reducer, middleware);\n\n // create saga\n const action = onHandleShowPageUri(req.params);\n const saga = returnSagaWithParams(handleShowPageUri, action);\n\n // run the saga middleware\n sagaMiddleware\n .run(saga)\n .done\n .then(() => {\n // render component to a string\n const html = renderToString(\n \n \n \n \n \n \n \n );\n\n // get head tags from helmet\n const helmet = Helmet.renderStatic();\n\n // check for a redirect\n if (context.url) {\n return res.redirect(301, context.url);\n }\n\n // get the initial state from our Redux store\n const preloadedState = store.getState();\n\n // send the rendered page back to the client\n res.send(renderFullPage(helmet, html, preloadedState));\n });\n};\n\n\n\n// WEBPACK FOOTER //\n// ./helpers/handleShowRender.jsx","module.exports = require(\"redux-saga\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"redux-saga\"\n// module id = 141\n// module chunks = 0","import { call, put, takeLatest } from 'redux-saga/effects';\nimport * as actions from 'constants/show_action_types';\nimport { onRequestError, onNewChannelRequest, onNewAssetRequest } from 'actions/show';\nimport { newAssetRequest } from 'sagas/show_asset';\nimport { newChannelRequest } from 'sagas/show_channel';\nimport lbryUri from 'utils/lbryUri';\n\nfunction * parseAndUpdateIdentifierAndClaim (modifier, claim) {\n // this is a request for an asset\n // claim will be an asset claim\n // the identifier could be a channel or a claim id\n let isChannel, channelName, channelClaimId, claimId, claimName, extension;\n try {\n ({ isChannel, channelName, channelClaimId, claimId } = lbryUri.parseIdentifier(modifier));\n ({ claimName, extension } = lbryUri.parseClaim(claim));\n } catch (error) {\n return yield put(onRequestError(error.message));\n }\n // trigger an new action to update the store\n if (isChannel) {\n return yield call(newAssetRequest, onNewAssetRequest(claimName, null, channelName, channelClaimId, extension));\n };\n yield call(newAssetRequest, onNewAssetRequest(claimName, claimId, null, null, extension));\n}\nfunction * parseAndUpdateClaimOnly (claim) {\n // this could be a request for an asset or a channel page\n // claim could be an asset claim or a channel claim\n let isChannel, channelName, channelClaimId;\n try {\n ({ isChannel, channelName, channelClaimId } = lbryUri.parseIdentifier(claim));\n } catch (error) {\n return yield put(onRequestError(error.message));\n }\n // trigger an new action to update the store\n // return early if this request is for a channel\n if (isChannel) {\n return yield call(newChannelRequest, onNewChannelRequest(channelName, channelClaimId));\n }\n // if not for a channel, parse the claim request\n let claimName, extension;\n try {\n ({claimName, extension} = lbryUri.parseClaim(claim));\n } catch (error) {\n return yield put(onRequestError(error.message));\n }\n yield call(newAssetRequest, onNewAssetRequest(claimName, null, null, null, extension));\n}\n\nexport function * handleShowPageUri (action) {\n const { identifier, claim } = action.data;\n if (identifier) {\n return yield call(parseAndUpdateIdentifierAndClaim, identifier, claim);\n }\n yield call(parseAndUpdateClaimOnly, claim);\n};\n\nexport function * watchHandleShowPageUri () {\n yield takeLatest(actions.HANDLE_SHOW_URI, handleShowPageUri);\n};\n\n\n\n// WEBPACK FOOTER //\n// ./react/sagas/show_uri.js","import { call, put, select, takeLatest } from 'redux-saga/effects';\nimport * as actions from 'constants/show_action_types';\nimport { addRequestToRequestList, onRequestError, onRequestUpdate, addAssetToAssetList } from 'actions/show';\nimport { getLongClaimId, getShortId, getClaimData } from 'api/assetApi';\nimport { selectShowState } from 'selectors/show';\n\nexport function * newAssetRequest (action) {\n const { requestType, requestId, name, modifier } = action.data;\n // put an action to update the request in redux\n yield put(onRequestUpdate(requestType, requestId));\n // is this an existing request?\n // If this uri is in the request list, it's already been fetched\n const state = yield select(selectShowState);\n if (state.requestList[requestId]) {\n return null;\n }\n // get long id && add request to request list\n let longId;\n try {\n ({data: longId} = yield call(getLongClaimId, name, modifier));\n } catch (error) {\n return yield put(onRequestError(error.message));\n }\n const assetKey = `a#${name}#${longId}`;\n yield put(addRequestToRequestList(requestId, null, assetKey));\n // is this an existing asset?\n // If this asset is in the asset list, it's already been fetched\n if (state.assetList[assetKey]) {\n return null;\n }\n // get short Id\n let shortId;\n try {\n ({data: shortId} = yield call(getShortId, name, longId));\n } catch (error) {\n return yield put(onRequestError(error.message));\n }\n // get asset claim data\n let claimData;\n try {\n ({data: claimData} = yield call(getClaimData, name, longId));\n } catch (error) {\n return yield put(onRequestError(error.message));\n }\n // add asset to asset list\n yield put(addAssetToAssetList(assetKey, null, name, longId, shortId, claimData));\n // clear any errors in request error\n yield put(onRequestError(null));\n};\n\nexport function * watchNewAssetRequest () {\n yield takeLatest(actions.ASSET_REQUEST_NEW, newAssetRequest);\n};\n\n\n\n// WEBPACK FOOTER //\n// ./react/sagas/show_asset.js","import Request from 'utils/request';\nconst { site: { host } } = require('../../config/speechConfig.js');\n\nexport function getLongClaimId (name, modifier) {\n let body = {};\n // create request params\n if (modifier) {\n if (modifier.id) {\n body['claimId'] = modifier.id;\n } else {\n body['channelName'] = modifier.channel.name;\n body['channelClaimId'] = modifier.channel.id;\n }\n }\n body['claimName'] = name;\n const params = {\n method : 'POST',\n headers: { 'Content-Type': 'application/json' },\n body : JSON.stringify(body),\n };\n // create url\n const url = `${host}/api/claim/long-id`;\n // return the request promise\n return Request(url, params);\n};\n\nexport function getShortId (name, claimId) {\n const url = `${host}/api/claim/short-id/${claimId}/${name}`;\n return Request(url);\n};\n\nexport function getClaimData (name, claimId) {\n const url = `${host}/api/claim/data/${name}/${claimId}`;\n return Request(url);\n};\n\n\n\n// WEBPACK FOOTER //\n// ./react/api/assetApi.js","import {call, put, select, takeLatest} from 'redux-saga/effects';\nimport * as actions from 'constants/show_action_types';\nimport { addNewChannelToChannelList, addRequestToRequestList, onRequestError, onRequestUpdate, updateChannelClaims } from 'actions/show';\nimport { getChannelClaims, getChannelData } from 'api/channelApi';\nimport { selectShowState } from 'selectors/show';\n\nexport function * newChannelRequest (action) {\n const { requestType, requestId, channelName, channelId } = action.data;\n // put an action to update the request in redux\n yield put(onRequestUpdate(requestType, requestId));\n // is this an existing request?\n // If this uri is in the request list, it's already been fetched\n const state = yield select(selectShowState);\n if (state.requestList[requestId]) {\n return null;\n }\n // get channel long id\n let longId, shortId;\n try {\n ({ data: {longChannelClaimId: longId, shortChannelClaimId: shortId} } = yield call(getChannelData, channelName, channelId));\n } catch (error) {\n return yield put(onRequestError(error.message));\n }\n // store the request in the channel requests list\n const channelKey = `c#${channelName}#${longId}`;\n yield put(addRequestToRequestList(requestId, null, channelKey));\n // is this an existing channel?\n // If this channel is in the channel list, it's already been fetched\n if (state.channelList[channelKey]) {\n return null;\n }\n // get channel claims data\n let claimsData;\n try {\n ({ data: claimsData } = yield call(getChannelClaims, channelName, longId, 1));\n } catch (error) {\n return yield put(onRequestError(error.message));\n }\n // store the channel data in the channel list\n yield put(addNewChannelToChannelList(channelKey, channelName, shortId, longId, claimsData));\n // clear any request errors\n yield put(onRequestError(null));\n}\n\nexport function * watchNewChannelRequest () {\n yield takeLatest(actions.CHANNEL_REQUEST_NEW, newChannelRequest);\n};\n\nfunction * getNewClaimsAndUpdateChannel (action) {\n const { channelKey, name, longId, page } = action.data;\n let claimsData;\n try {\n ({ data: claimsData } = yield call(getChannelClaims, name, longId, page));\n } catch (error) {\n return yield put(onRequestError(error.message));\n }\n yield put(updateChannelClaims(channelKey, claimsData));\n}\n\nexport function * watchUpdateChannelClaims () {\n yield takeLatest(actions.CHANNEL_CLAIMS_UPDATE_ASYNC, getNewClaimsAndUpdateChannel);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./react/sagas/show_channel.js","import Request from 'utils/request';\nconst { site: { host } } = require('../../config/speechConfig.js');\n\nexport function getChannelData (name, id) {\n if (!id) id = 'none';\n const url = `${host}/api/channel/data/${name}/${id}`;\n return Request(url);\n};\n\nexport function getChannelClaims (name, longId, page) {\n if (!page) page = 1;\n const url = `${host}/api/channel/claims/${name}/${longId}/${page}`;\n return Request(url);\n};\n\n\n\n// WEBPACK FOOTER //\n// ./react/api/channelApi.js","module.exports = {\n REGEXP_INVALID_CLAIM : /[^A-Za-z0-9-]/g,\n REGEXP_INVALID_CHANNEL: /[^A-Za-z0-9-@]/g,\n REGEXP_ADDRESS : /^b(?=[^0OIl]{32,33})[0-9A-Za-z]{32,33}$/,\n CHANNEL_CHAR : '@',\n parseIdentifier : function (identifier) {\n const componentsRegex = new RegExp(\n '([^:$#/]*)' + // value (stops at the first separator or end)\n '([:$#]?)([^/]*)' // modifier separator, modifier (stops at the first path separator or end)\n );\n const [proto, value, modifierSeperator, modifier] = componentsRegex // eslint-disable-line no-unused-vars\n .exec(identifier)\n .map(match => match || null);\n\n // Validate and process name\n if (!value) {\n throw new Error(`Check your URL. No channel name provided before \"${modifierSeperator}\"`);\n }\n const isChannel = value.startsWith(module.exports.CHANNEL_CHAR);\n const channelName = isChannel ? value : null;\n let claimId;\n if (isChannel) {\n if (!channelName) {\n throw new Error('Check your URL. No channel name after \"@\".');\n }\n const nameBadChars = (channelName).match(module.exports.REGEXP_INVALID_CHANNEL);\n if (nameBadChars) {\n throw new Error(`Check your URL. Invalid characters in channel name: \"${nameBadChars.join(', ')}\".`);\n }\n } else {\n claimId = value;\n }\n\n // Validate and process modifier\n let channelClaimId;\n if (modifierSeperator) {\n if (!modifier) {\n throw new Error(`Check your URL. No modifier provided after separator \"${modifierSeperator}\"`);\n }\n\n if (modifierSeperator === ':') {\n channelClaimId = modifier;\n } else {\n throw new Error(`Check your URL. The \"${modifierSeperator}\" modifier is not currently supported`);\n }\n }\n return {\n isChannel,\n channelName,\n channelClaimId: channelClaimId || null,\n claimId : claimId || null,\n };\n },\n parseClaim: function (name) {\n const componentsRegex = new RegExp(\n '([^:$#/.]*)' + // name (stops at the first extension)\n '([:$#.]?)([^/]*)' // extension separator, extension (stops at the first path separator or end)\n );\n const [proto, claimName, extensionSeperator, extension] = componentsRegex // eslint-disable-line no-unused-vars\n .exec(name)\n .map(match => match || null);\n\n // Validate and process name\n if (!claimName) {\n throw new Error('Check your URL. No claim name provided before \".\"');\n }\n const nameBadChars = (claimName).match(module.exports.REGEXP_INVALID_CLAIM);\n if (nameBadChars) {\n throw new Error(`Check your URL. Invalid characters in claim name: \"${nameBadChars.join(', ')}\".`);\n }\n // Validate and process extension\n if (extensionSeperator) {\n if (!extension) {\n throw new Error(`Check your URL. No file extension provided after separator \"${extensionSeperator}\".`);\n }\n if (extensionSeperator !== '.') {\n throw new Error(`Check your URL. The \"${extensionSeperator}\" separator is not supported in the claim name.`);\n }\n }\n return {\n claimName,\n extension: extension || null,\n };\n },\n};\n\n\n\n// WEBPACK FOOTER //\n// ./react/utils/lbryUri.js","const handlePageRender = require('../helpers/handlePageRender.jsx');\n\nmodule.exports = app => {\n // a catch-all route if someone visits a page that does not exist\n app.use('*', (req, res) => {\n // send response\n handlePageRender(req, res);\n });\n};\n\n\n\n// WEBPACK FOOTER //\n// ./routes/fallback-routes.js","module.exports = require(\"http\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"http\"\n// module id = 149\n// module chunks = 0"],"sourceRoot":""} \ No newline at end of file diff --git a/server.js b/server.js index 40a8390e..65413f3b 100644 --- a/server.js +++ b/server.js @@ -88,11 +88,15 @@ const startServer = (mysqlConfig) => { }); }; -const speech = { - start (config) { - const { mysqlConfig } = config; - startServer(mysqlConfig); +module.exports = { + hello () { + console.log('hello world'); }, + speak (something) { + console.log(something); + }, + // start (config) { + // const { mysqlConfig } = config; + // startServer(mysqlConfig); + // }, }; - -module.exports = speech;