Commit 80a744ea authored by Dele Olajide's avatar Dele Olajide

ofmeet plugin - version 0.1.0

Implemented openfire meeting applications api and sample apps
parent cf9521e3
...@@ -49,6 +49,13 @@ ...@@ -49,6 +49,13 @@
Openfire Meetings Plugin Changelog Openfire Meetings Plugin Changelog
</h1> </h1>
<p><b>0.1.0</b> -- Feb 4th, 2015</p>
<ul>
<li>Implemented Openfire Meeting collaborative applications api</li>
<li>Added simple sample applications for rich text editing and whiteboard</li>
</ul>
<p><b>0.0.9</b> -- Jan 26th, 2015</p> <p><b>0.0.9</b> -- Jan 26th, 2015</p>
<ul> <ul>
......
...@@ -5,8 +5,8 @@ ...@@ -5,8 +5,8 @@
<name>Openfire Meetings</name> <name>Openfire Meetings</name>
<description>Provides high quality, scalable video conferences using Jitsi Meet and Jitsi Videobridge</description> <description>Provides high quality, scalable video conferences using Jitsi Meet and Jitsi Videobridge</description>
<author>Ignite Realtime</author> <author>Ignite Realtime</author>
<version>0.0.9</version> <version>0.1.0</version>
<date>01/26/2015</date> <date>02/04/2015</date>
<minServerVersion>3.9.9</minServerVersion> <minServerVersion>3.9.9</minServerVersion>
<adminconsole> <adminconsole>
......
...@@ -1467,24 +1467,7 @@ $(document).ready(function () { ...@@ -1467,24 +1467,7 @@ $(document).ready(function () {
$(window).bind('beforeunload', function () { $(window).bind('beforeunload', function () {
if (connection && connection.connected) { if (connection && connection.connected) {
// ensure signout // ensure signout
$.ajax({ connection.disconnect();
type: 'POST',
url: config.bosh,
async: false,
cache: false,
contentType: 'application/xml',
data: "<body rid='" + (connection.rid || connection._proto.rid)
+ "' xmlns='http://jabber.org/protocol/httpbind' sid='"
+ (connection.sid || connection._proto.sid)
+ "' type='terminate'><presence xmlns='jabber:client' type='unavailable'/></body>",
success: function (data) {
console.log('signed out');
console.log(data);
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
console.log('signout error', textStatus + ' (' + errorThrown + ')');
}
});
} }
disposeConference(true); disposeConference(true);
if(APIConnector.isEnabled()) if(APIConnector.isEnabled())
......
var hash = null;
var url = urlParam("url");
var frameWindow = null;
function start()
{
frameWindow = document.getElementById('iframe1');
if (window.location.hash) hash = window.location.hash.substring(1);
console.log("app.js start", hash, url);
frameWindow.onload = function()
{
console.log("app.js onload", frameWindow);
}
if (url) frameWindow.src = url;
window.parent.connection.ofmuc.appReady();
}
function stop()
{
console.log("app.js stop");
}
function urlParam(name)
{
var results = new RegExp('[\\?&]' + name + '=([^&#]*)').exec(window.location.href);
if (!results) { return undefined; }
return decodeURIComponent(results[1]) || undefined;
}
window.onhashchange = function()
{
hash = window.location.hash.substring(1);
}
.togetherjs * {
-webkit-box-sizing: content-box !important;
-moz-box-sizing: content-box !important;
box-sizing: content-box !important;
}
.togetherjs-cursor svg {
-webkit-filter: drop-shadow(1px 3px 2px rgba(0, 0, 0, 0.3));
-webkit-transform: rotate(-10deg);
}
.togetherjs-cursor-img {
position: relative;
top: 0;
}
.togetherjs-cursor img {
width: 20px;
-webkit-filter: drop-shadow(0px 2px 1px rgba(0, 0, 0, 0.2));
/*FIX ME, moz filter not working...*/
-moz-filter: drop-shadow(0px 2px 1px rgba(0, 0, 0, 0.2));
filter: drop-shadow(0px 2px 1px rgba(0, 0, 0, 0.2));
}
.togetherjs-cursor {
position: absolute;
z-index: 9999;
font-size: 28px;
font-weight: bolder;
/* This magic CSS rule makes this element basically invisible to clicks/etc:
(good on all but IE: http://caniuse.com/pointer-events */
pointer-events: none;
/*FIXME: maybe these should use position: fixed so the cursor
stays stuck to the top of the screen until the appropriate time
(when .togetherjs-scrolled-above/below is removed)?*/
}
.togetherjs-cursor:hover {
cursor: pointer;
}
.togetherjs-cursor.togetherjs-scrolled-above {
position: fixed;
}
.togetherjs-cursor.togetherjs-scrolled-above svg {
-webkit-transition-duration: 0.8s;
-webkit-transition-property: -webkit-transform;
-webkit-transform: rotate(20deg);
transition-duration: 0.8s;
transition-property: transform;
transform: rotate(20deg);
}
.togetherjs-cursor.togetherjs-scrolled-above .togetherjs-cursor-down {
display: none;
}
.togetherjs-cursor.togetherjs-scrolled-below {
position: fixed;
}
.togetherjs-cursor.togetherjs-scrolled-below svg {
-webkit-transition-duration: 0.8s;
-webkit-transition-property: -webkit-transform;
-webkit-transform: rotate(-150deg);
transition-duration: 0.8s;
transition-property: transform;
transform: rotate(-150deg);
}
.togetherjs-cursor.togetherjs-scrolled-below .togetherjs-cursor-up {
display: none;
}
.togetherjs-cursor.togetherjs-scrolled-normal svg {
-webkit-transition-duration: 0.8s;
-webkit-transition-property: -webkit-transform;
-webkit-transform: rotate(-10deg);
transition-duration: 0.8s;
transition-property: transform;
transform: rotate(-10deg);
}
.togetherjs-cursor.togetherjs-scrolled-normal .togetherjs-cursor-up,
.togetherjs-cursor.togetherjs-scrolled-normal .togetherjs-cursor-down {
display: none;
}
.togetherjs-cursor .togetherjs-cursor-container {
opacity: 0.9;
white-space: nowrap;
font-family: openSansLight, Helvetica, 'Helvetica Neue', Arial, sans-serif;
font-size: 40%;
position: relative;
top: 5px;
left: 15px;
padding: 8px;
border-radius: 4px;
box-shadow: 0 1px 1px rgba(0, 0, 0, 0.2);
border: 1px solid rgba(0, 0, 0, 0.2);
-moz-box-shadow: 0px 2px 4px 0px rgba(0, 0, 0, 0.5);
-webkit-box-shadow: 0px 2px 4px 0px rgba(0, 0, 0, 0.5);
box-shadow: 0px 2px 4px 0px rgba(0, 0, 0, 0.5);
}
.togetherjs-click {
position: absolute;
z-index: 9998;
pointer-events: none;
width: 10px;
height: 10px;
margin: -5px 0 0 -5px;
border-radius: 5px;
border: 3px solid #ff3a29;
/* Note, you must call this like:
.transition(~"value, value, value")*/
transition: width 2s, height 2s, margin 2s, border 2s;
-moz-transition: width 2s, height 2s, margin 2s, border 2s;
-webkit-transition: width 2s, height 2s, margin 2s, border 2s;
-o-transition: width 2s, height 2s, margin 2s, border 2s;
}
.togetherjs-click.togetherjs-clicking {
width: 40px;
height: 40px;
margin: -20px 0 0 -20px;
border-radius: 20px;
border: 3px solid rgba(0, 0, 0, 0);
}
This diff is collapsed.
This diff is collapsed.
/* GLOBAL STYLES
-------------------------------------------------- */
/* Padding below the footer and lighter body text */
body {
padding-bottom: 40px;
color: #5a5a5a;
}
/* CUSTOMIZE THE NAVBAR
-------------------------------------------------- */
/* Special class on .container surrounding .navbar, used for positioning it into place. */
.navbar-wrapper {
position: relative;
z-index: 15;
}
/* CUSTOMIZE THE CAROUSEL
-------------------------------------------------- */
/* Carousel base class */
.carousel {
padding-top: 60px;
padding-bottom: 60px;
background: #ccc;
/* Negative margin to pull up carousel. 90px is roughly margins and height of navbar. */
/*margin-top: -90px;*/
}
/* Since positioning the image, we need to help out the caption */
.carousel-caption {
z-index: 10;
}
/* Declare heights because of positioning of img element */
.carousel .item {
height: 500px;
}
.carousel-inner > .item > img {
position: absolute;
top: 0;
left: 0;
min-width: 100%;
height: 500px;
}
/* MARKETING CONTENT
-------------------------------------------------- */
/* Pad the edges of the mobile views a bit */
.marketing {
padding-left: 15px;
padding-right: 15px;
}
/* Center align the text within the three columns below the carousel */
.marketing .col-lg-4 {
text-align: center;
margin-bottom: 20px;
}
.marketing h2 {
font-weight: normal;
}
.marketing .col-lg-4 p {
margin-left: 10px;
margin-right: 10px;
}
/* Featurettes
------------------------- */
.featurette-divider {
margin: 80px 0; /* Space out the Bootstrap <hr> more */
}
.featurette {
padding-top: 120px; /* Vertically center images part 1: add padding above and below text. */
overflow: hidden; /* Vertically center images part 2: clear their floats. */
}
.featurette-image {
margin-top: -120px; /* Vertically center images part 3: negative margin up the image the same amount of the padding to center it. */
}
/* Give some space on the sides of the floated elements so text doesn't run right into it. */
.featurette-image.pull-left {
margin-right: 40px;
}
.featurette-image.pull-right {
margin-left: 40px;
}
/* Thin out the marketing headings */
.featurette-heading {
font-size: 50px;
font-weight: 300;
line-height: 1;
letter-spacing: -1px;
}
/* RESPONSIVE CSS
-------------------------------------------------- */
@media (min-width: 768px) {
/* Remve the edge padding needed for mobile */
.marketing {
padding-left: 0;
padding-right: 0;
}
/* Navbar positioning foo */
.navbar-wrapper {
margin-top: 20px;
}
/* The navbar becomes detached from the top, so we round the corners */
.navbar-wrapper .navbar {
border-radius: 4px;
}
/* Bump up size of carousel content */
.carousel-caption p {
margin-bottom: 20px;
font-size: 21px;
line-height: 1.4;
}
}
This diff is collapsed.
/*THESE ARE GUIDELINES*/
.container {
/* padding-left: 15px;
padding-right: 15px;*/
}
.row {
margin-bottom: 20px;
}
.row .row {
margin-top: 10px;
margin-bottom: 0;
}
[class*="col-"] {
padding-top: 15px;
padding-bottom: 15px;
border: 1px solid #ddd;
/*background-color: rgba(0,0,0,.15);*/
border: 0px solid rgba(86,61,124,.2);
}
hr {
margin-top: 40px;
margin-bottom: 40px;
}
\ No newline at end of file
body {
padding-bottom: 20px;
}
/* Wrapping element */
/* Set some basic padding to keep content from hitting the edges */
.body-content {
padding-left: 15px;
padding-right: 15px;
}
/* Responsive: Portrait tablets and up */
@media screen and (min-width: 768px) {
/* Let the jumbotron breathe */
.jumbotron {
margin-top: 20px;
}
/* Remove padding from wrapping element since we kick in the grid classes here */
.body-content {
padding: 0;
}
}
\ No newline at end of file
.upper-button {
border-bottom-left-radius: 0px;
border-bottom-right-radius: 0px;
}
.bottom-button {
border-top-left-radius: 0px;
border-top-right-radius: 0px;
}
.black-pick:hover {
background-color: #000;
border-color: #000;
}
.black-pick {
background-color: #202020;
border-color: #202020;
}
This diff is collapsed.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=Edge">
<title>Openfire Meetings shared drawing demo</title>
<meta name="viewport" content="width=320, initial-scale=1.0, maximum-scale=1.0, user-scalable=0"/>
<script src="../jquery-1.10.2.min.js"></script>
<script src="../util.js"></script>
<script src="../ofmeet.js"></script>
<script src="../tinycolor.js"></script>
<script src="js/bootstrap.min.js"></script>
<script src="js/parallax.js"></script>
<script src="js/custom.js"></script>
<script src="js/scrollTo.js"></script>
<script src="js/scrollspy.js"></script>
<script src="js/waypoints.min.js"></script>
<script src="js/how-animations.js"></script>
<script src="js/retina.js"></script>
<link href="../cursor.css" rel="stylesheet" type="text/css" />
<link href="css/bootstrap.css" rel="stylesheet">
<link href="css/jumbotron.css" rel="stylesheet">
<link href="css/carousel.css" rel="stylesheet">
<link href="css/grid.css" rel="stylesheet">
<link href="css/style.css" rel="stylesheet">
<link href="css/font-awesome.css" rel="stylesheet">
<link href="css/main.css" rel="stylesheet">
</head>
<body>
<div class="container">
<section class="body-content row" id="sketchapp" style="margin-left: 0px; margin-right: 0px;">
<div class="btn-group btn-group-justified" style="margin-left: auto; margin-right: auto;">
<a class="btn btn-info color-picker upper-button">Blue</a>
<a class="btn btn-success color-picker">Green</a>
<a class="btn btn-warning color-picker">Yellow</a>
<a class="btn btn-danger color-picker">Red</a>
<a class="btn btn-success color-picker black-pick upper-button" style="border-bottom-width: 0px;">Black</a>
</div>
<div class="clearfix"></div>
<div id="sketchContainer" style="width: 100%; border: 1px solid rgba(0,0,0,0.2);">
<canvas id="sketch"></canvas>
</div>
<div class="btn-group btn-group-justified" style="margin-left: auto; margin-right: auto;">
<a class="btn btn-info user-color-pick bottom-button" style="width: 35%;">User Color</a>
<a class="btn btn-success plus-size" style="width: 15%;">
<i class="fa fa-plus-square"></i>
</a>
<a class="btn btn-warning clear" style="width: 15%;">
<i class="fa fa-times-circle"></i>
</a>
<a class="btn btn-danger minus-size" style="width: 15%;">
<i class="fa fa-minus-square"></i>
</a>
<a class="btn btn-default eraser bottom-button" style="width: 35%; border-top-width: 0px;">
<i class="fa fa-eraser"></i>
</a>
</div>
</section>
</div>
<script src="js/sketch.js"></script>
</body>
</html>
This diff is collapsed.
!function ($) {
$(function(){
// hero image swap
// $("img.swap1")
// .mouseover(function() {
// $(this).fadeIn("slow", function(){
// var src = $(this).attr("src").match(/[^\.]+/) + "-overlay.png";
// $(this).attr("src", src);
// });
// })
// .mouseout(function() {
// var src = $(this).attr("src").replace("-overlay.png", ".png");
// $(this).attr("src", src);
// });
// stop youtube from playing on btn close
$('.video-closebtn').click(function(){
//alert("tset");
var myPlayer = document.getElementById('youtubevid');
myPlayer.stopVideo();
});
// detect a mobile device
var isMobile = {
Android: function() {
return navigator.userAgent.match(/Android/i);
},
BlackBerry: function() {
return navigator.userAgent.match(/BlackBerry/i);
},
iOS: function() {
return navigator.userAgent.match(/iPhone|iPad|iPod/i);
},
Opera: function() {
return navigator.userAgent.match(/Opera Mini/i);
},
Windows: function() {
return navigator.userAgent.match(/IEMobile/i);
},
any: function() {
return (isMobile.Android() || isMobile.BlackBerry() || isMobile.iOS() || isMobile.Opera() || isMobile.Windows());
}
};
// open up video url
if(isMobile.any()){
//play video on mobile a device
$("#video-area").html('<a href="http://www.youtube.com/embed/hJEq4W0FZQ0?autoplay=1"><img src="images/site-hero-image@2x.png" class="img-responsive"></a>');
// turn off animations
jQuery.fx.off = true;
$('#video-area').css("-webkit-animation", "none");
$('#video-area').css("-moz-animation", "none");
$('#video-area').css("-ms-animation", "none");
$('#video-area').css("animation", "none");
$('.hero-header-text').css("-webkit-animation", "none");
$('.hero-header-text').css("-moz-animation", "none");
$('.hero-header-text').css("-ms-animation", "none");
$('.hero-header-text').css("animation", "none");
$('.hero-tagline').css("-webkit-animation", "none");
$('.hero-tagline').css("-moz-animation", "none");
$('.hero-tagline').css("-ms-animation", "none");
$('.hero-tagline').css("animation", "none");
$('.main-get-started').css("-webkit-animation", "none");
$('.main-get-started').css("-moz-animation", "none");
$('.main-get-started').css("-ms-animation", "none");
$('.main-get-started').css("animation", "none");
$( ".howto-animation-01" ).replaceWith( "<div class='col-xs-12'><p><img src='images/togetherjs-how-01-addit.png' alt='...' class='img-rounded img-responsive how-section'></p><h4 class='text-left' style='margin-top:0px'>Add TogetherJS Javascript and HTML to your site.</h4><p class='text-left smtextright'>Just copy and paste TogetherJS's JS library and HTML snippet into your site or app to give it out-of-the-box collaboration tools and features.</p></div>" );
$( ".howto-animation-02" ).replaceWith( "<div class='col-xs-12'><p><img src='images/togetherjs-how-02-dock-sm@2x.png' alt='...' class='img-rounded img-responsive how-section'></p><h4 class='text-left' style='margin-top:0px'>Your site is now TogetherJS enabled.</h4><p class='text-left smtextleft'>If your users want to collaborate with a friend, they can click the TogetherJS button on your site.</p></div>" );
$( ".howto-animation-03" ).replaceWith( "<div class='col-xs-12'><p><img src='images/togetherjs-how-03-collaborate-cursors@2x.png' alt='...' class='img-rounded img-responsive how-section'></p><h4 class='text-left' style='margin-top:0px'>Your users can then collaborate in real time!</h4><p class='text-left smtextright'>Your users can send a unique TogetherJS url to a friend. When the friend opens the link, each user sees the same page and can interact with it together in real time.</p></div>" );
$("#features .col-xs-12.col-sm-6").first().css({
marginBottom: "-8px",
paddingBottom: "0px"
});
//
}
else {
//Video player
$( "#video-area" ).click(function() {
$( "#marketing-video" ).fadeIn();
});
$( "#marketing-video" ).click(function() {
$( "#marketing-video" ).fadeOut();
});
$( ".video-closebtn" ).click(function() {
$( "#marketing-video" ).fadeOut();
});
}
})
}(window.jQuery)
// hover effect over video player
// $('#main-image').on('mouseenter', function() {
// $(this).fadeOut('slow');
// $('#main-image-overlay').fadeIn('slow');
// });
//
// $('#main-image-overlay').css({left: $('#main-image').position().left, top: $('#main-image').position().top})
// .on('mouseleave', function() {
// $(this).fadeOut('slow');
// $('#main-image').fadeIn('slow');
// });
// press Escape to close the video player
// $(document).keyup(function(e) {
//
// if (e.keyCode == 27) {
// $( "#marketing-video" ).fadeOut();
// } // esc
//
// });
// Handler for the Get Help button, to check that help is actually available
$(function () {
var inviteChannel = "https://hub.togetherjs.com/hub/developers";
var $help = $("#get-help");
if (! $help.length) {
// No button on this page
return;
}
$help.click(TogetherJS);
/*
TogetherJS.checkForUsersOnChannel(inviteChannel, function (n) {
if (n === 0) {
$help.prop("disabled", true);
$help.attr("title", "Sorry, no one is currently available");
// FIXME: should grey out the invite text too
$("#nobody-home").show();
}
});
*/
TogetherJS.on("ready", function () {
TogetherJS.require(["who", "session"], function (who, session) {
if (session.firstRun) {
who.invite(inviteChannel, null);
}
});
});
});
// Keeps the invite popup from happening, since the invite will automatically
// be sent to the Get Help developers
window.TogetherJSConfig_suppressInvite = true;
!function ($) {
$(function(){
function jsUpdateSize(){
// Get the dimensions of the viewport
var width = window.innerWidth ||
document.documentElement.clientWidth ||
document.body.clientWidth;
var height = window.innerHeight ||
document.documentElement.clientHeight ||
document.body.clientHeight;
//document.getElementById('jsWidth').innerHTML = width; // Display the width
//document.getElementById('jsHeight').innerHTML = height;// Display the height
if(width <= 480){
//disable animations
}
else{
//play animations
}
};
window.onload = jsUpdateSize; // When the page first loads
window.onresize = jsUpdateSize; // When the browser changes size
//animate Why use ConnectJS?
$('#tour').waypoint(function() {
setTimeout(function() {
$( ".why-connect-01 img" ).animate({
top: "0",
opacity: 1
}, 300);
}, 0);
setTimeout(function() {
$( ".why-connect-02 img" ).animate({
top: "0",
opacity: 1
}, 300);
}, 100);
setTimeout(function() {
$( ".why-connect-03 img" ).animate({
top: "0",
opacity: 1
}, 300);
}, 200);
}, { offset: 300, triggerOnce: true });
//animate How does ConnectJS work?
$('.howto-animation-01').waypoint(function() {
// 1. Add ConnectJS JavaScript and HTML to your site.
// animate in first
startFirstAnimation();
function startFirstAnimation() {
$('.how-section-imganim-01').animate({
left: "60%"
}, 800).animate({
opacity: "0"
}, 800).animate({
left: "11%"
}, 7000).animate({
opacity: "1"
}, startFirstAnimation);
}
// animate in second
startSecondAnimation();
function startSecondAnimation() {
$('.how-section-imganim-02').animate({
left: "60%"
}, 800).animate({
opacity: "0"
}, 800).animate({
left: "9%"
}, 7000).animate({
opacity: "1"
}, startSecondAnimation);
startFadeInOut();
function startFadeInOut(){
$('.how-section-imganim-03').delay(1000).fadeIn().delay(6000).fadeOut();
}
}
}, { offset: 300, triggerOnce: false });
// 2. Your site is now ConnectJS enabled.
$('.howto-animation-02').waypoint(function() {
//startHowAnimation2();
function fadeinDock() {
$(".how-section-btncollab").fadeOut();
$(".how-section-btncollabpressed").fadeIn();
$(".how-section-dockplacement").fadeIn();
}
function fadeoutDock() {
$(".how-section-dockplacement").fadeOut();
$(".how-section-btncollabpressed").fadeOut();
$(".how-section-btncollab").fadeIn();
}
function startit(){
fadeinDock();
setTimeout(function () {
fadeoutDock();
setTimeout(startit, 5000);
}, 5000)
}
startit();
}, { offset: 200, triggerOnce: false });
// 3. Your site is now ConnectJS enabled.
$('.howto-animation-03').waypoint(function() {
function startCursorAnimation(){
$('.cursor-placement-01').animate({
left: "76%"
}, 800);
$('.cursor-placement-03').animate({
left: "40%"
}, 800);
setTimeout(function() {
$('.cursor-placement-02').animate({
top: "60%"
}, 800);
$('.cursor-placement-04').animate({
top: "29%"
}, 800);
}, 1000);
setTimeout(function() {
$('.cursor-placement-01').animate({
left: "78%"
}, 800);
$('.cursor-placement-03').animate({
left: "44%"
}, 800);
}, 1000);
setTimeout(function() {
$('.cursor-placement-02').animate({
top: "57%"
}, 800);
$('.cursor-placement-04').animate({
top: "27%"
}, 800);
}, 1000);
setTimeout(startCursorAnimation, 7000);
}
startCursorAnimation();
console.log("animation 3");
}, { offset: 200, triggerOnce: true });
})
}(window.jQuery)
This diff is collapsed.
$(document).ready(function(){
// detect a mobile device
var isMobile = {
Android: function() {
return navigator.userAgent.match(/Android/i);
},
BlackBerry: function() {
return navigator.userAgent.match(/BlackBerry/i);
},
iOS: function() {
return navigator.userAgent.match(/iPhone|iPad|iPod/i);
},
Opera: function() {
return navigator.userAgent.match(/Opera Mini/i);
},
Windows: function() {
return navigator.userAgent.match(/IEMobile/i);
},
any: function() {
return (isMobile.Android() || isMobile.BlackBerry() || isMobile.iOS() || isMobile.Opera() || isMobile.Windows());
}
};
// Cache the Window object
$window = $(window);
$('section[data-type="background"]').each(function(){
var $bgobj = $(this); // assigning the object
$(window).scroll(function() {
// Scroll the background at var speed
// the yPos is a negative value because we're scrolling it UP!
var yPos = -($window.scrollTop() / $bgobj.data('speed'));
// Put together our final background position
var coords = '50% '+ yPos + 'px';
if (isMobile.any()) {
//remove parallax
var coords = '';
}
// Move the background
$bgobj.css({ backgroundPosition: coords });
}); // window scroll Ends
});
});
// retina.js, a high-resolution image swapper (http://retinajs.com), v0.0.2
(function(){function t(e){this.path=e;var t=this.path.split("."),n=t.slice(0,t.length-1).join("."),r=t[t.length-1];this.at_2x_path=n+"@2x."+r}function n(e){this.el=e,this.path=new t(this.el.getAttribute("src"));var n=this;this.path.check_2x_variant(function(e){e&&n.swap()})}var e=typeof exports=="undefined"?window:exports;e.RetinaImagePath=t,t.confirmed_paths=[],t.prototype.is_external=function(){return!!this.path.match(/^https?\:/i)&&!this.path.match("//"+document.domain)},t.prototype.check_2x_variant=function(e){var n,r=this;if(this.is_external())return e(!1);if(this.at_2x_path in t.confirmed_paths)return e(!0);n=new XMLHttpRequest,n.open("HEAD",this.at_2x_path),n.onreadystatechange=function(){return n.readyState!=4?e(!1):n.status>=200&&n.status<=399?(t.confirmed_paths.push(r.at_2x_path),e(!0)):e(!1)},n.send()},e.RetinaImage=n,n.prototype.swap=function(e){function n(){t.el.complete?(t.el.setAttribute("width",t.el.offsetWidth),t.el.setAttribute("height",t.el.offsetHeight),t.el.setAttribute("src",e)):setTimeout(n,5)}typeof e=="undefined"&&(e=this.path.at_2x_path);var t=this;n()},e.devicePixelRatio>1&&(window.onload=function(){var e=document.getElementsByTagName("img"),t=[],r,i;for(r=0;r<e.length;r++)i=e[r],t.push(new n(i))})})();
\ No newline at end of file
!function ($) {
$(function(){
//var position = p.position();
//$("#sidenav").position.top;
//alert($("#sidenav").position().left);
//side nav bar
$('#sidenav').affix({
offset: {
top: 100
, bottom: 100
}
})
var $root = $('html, body');
// unique nav tag here for HOME PAGE
$('a.scrollnav').click(function() {
var href = $.attr(this, 'href');
$root.animate({
scrollTop: $(href).offset().top - 50
}, 500, function () {
window.location.hash = href;
});
return false;
});
// unique nav tag here for DOCUMENATION page
$('a.scrollnavdocs').click(function() {
var href = $.attr(this, 'href');
$root.animate({
scrollTop: $(href).offset().top - 100
}, 500, function () {
window.location.hash = href;
});
return false;
});
})
}(window.jQuery)
/* ========================================================================
* Bootstrap: scrollspy.js v3.0.0
* http://twbs.github.com/bootstrap/javascript.html#scrollspy
* ========================================================================
* Copyright 2012 Twitter, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ======================================================================== */
+function ($) { "use strict";
// SCROLLSPY CLASS DEFINITION
// ==========================
function ScrollSpy(element, options) {
var href
var process = $.proxy(this.process, this)
this.$element = $(element).is('body') ? $(window) : $(element)
this.$body = $('body')
this.$scrollElement = this.$element.on('scroll.bs.scroll-spy.data-api', process)
this.options = $.extend({}, ScrollSpy.DEFAULTS, options)
this.selector = (this.options.target
|| ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
|| '') + ' .nav li > a'
this.offsets = $([])
this.targets = $([])
this.activeTarget = null
this.refresh()
this.process()
}
ScrollSpy.DEFAULTS = {
offset: 10
}
ScrollSpy.prototype.refresh = function () {
var offsetMethod = this.$element[0] == window ? 'offset' : 'position'
this.offsets = $([])
this.targets = $([])
var self = this
var $targets = this.$body
.find(this.selector)
.map(function () {
var $el = $(this)
var href = $el.data('target') || $el.attr('href')
var $href = /^#\w/.test(href) && $(href)
return ($href
&& $href.length
&& [[ $href[offsetMethod]().top + (!$.isWindow(self.$scrollElement.get(0)) && self.$scrollElement.scrollTop()), href ]]) || null
})
.sort(function (a, b) { return a[0] - b[0] })
.each(function () {
self.offsets.push(this[0])
self.targets.push(this[1])
})
}
ScrollSpy.prototype.process = function () {
var scrollTop = this.$scrollElement.scrollTop() + this.options.offset
var scrollHeight = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight
var maxScroll = scrollHeight - this.$scrollElement.height()
var offsets = this.offsets
var targets = this.targets
var activeTarget = this.activeTarget
var i
if (scrollTop >= maxScroll) {
return activeTarget != (i = targets.last()[0]) && this.activate(i)
}
for (i = offsets.length; i--;) {
activeTarget != targets[i]
&& scrollTop >= offsets[i]
&& (!offsets[i + 1] || scrollTop <= offsets[i + 1])
&& this.activate( targets[i] )
}
}
ScrollSpy.prototype.activate = function (target) {
this.activeTarget = target
$(this.selector)
.parents('.active')
.removeClass('active')
var selector = this.selector
+ '[data-target="' + target + '"],'
+ this.selector + '[href="' + target + '"]'
var active = $(selector)
.parents('li')
.addClass('active')
if (active.parent('.dropdown-menu').length) {
active = active
.closest('li.dropdown')
.addClass('active')
}
active.trigger('activate')
}
// SCROLLSPY PLUGIN DEFINITION
// ===========================
var old = $.fn.scrollspy
$.fn.scrollspy = function (option) {
return this.each(function () {
var $this = $(this)
var data = $this.data('bs.scrollspy')
var options = typeof option == 'object' && option
if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))
if (typeof option == 'string') data[option]()
})
}
$.fn.scrollspy.Constructor = ScrollSpy
// SCROLLSPY NO CONFLICT
// =====================
$.fn.scrollspy.noConflict = function () {
$.fn.scrollspy = old
return this
}
// SCROLLSPY DATA-API
// ==================
$(window).on('load', function () {
$('[data-spy="scroll"]').each(function () {
var $spy = $(this)
$spy.scrollspy($spy.data())
})
})
}(window.jQuery);
This diff is collapsed.
// Generated by CoffeeScript 1.6.2
/*
jQuery Waypoints - v2.0.3
Copyright (c) 2011-2013 Caleb Troughton
Dual licensed under the MIT license and GPL license.
https://github.com/imakewebthings/jquery-waypoints/blob/master/licenses.txt
*/
(function(){var t=[].indexOf||function(t){for(var e=0,n=this.length;e<n;e++){if(e in this&&this[e]===t)return e}return-1},e=[].slice;(function(t,e){if(typeof define==="function"&&define.amd){return define("waypoints",["jquery"],function(n){return e(n,t)})}else{return e(t.jQuery,t)}})(this,function(n,r){var i,o,l,s,f,u,a,c,h,d,p,y,v,w,g,m;i=n(r);c=t.call(r,"ontouchstart")>=0;s={horizontal:{},vertical:{}};f=1;a={};u="waypoints-context-id";p="resize.waypoints";y="scroll.waypoints";v=1;w="waypoints-waypoint-ids";g="waypoint";m="waypoints";o=function(){function t(t){var e=this;this.$element=t;this.element=t[0];this.didResize=false;this.didScroll=false;this.id="context"+f++;this.oldScroll={x:t.scrollLeft(),y:t.scrollTop()};this.waypoints={horizontal:{},vertical:{}};t.data(u,this.id);a[this.id]=this;t.bind(y,function(){var t;if(!(e.didScroll||c)){e.didScroll=true;t=function(){e.doScroll();return e.didScroll=false};return r.setTimeout(t,n[m].settings.scrollThrottle)}});t.bind(p,function(){var t;if(!e.didResize){e.didResize=true;t=function(){n[m]("refresh");return e.didResize=false};return r.setTimeout(t,n[m].settings.resizeThrottle)}})}t.prototype.doScroll=function(){var t,e=this;t={horizontal:{newScroll:this.$element.scrollLeft(),oldScroll:this.oldScroll.x,forward:"right",backward:"left"},vertical:{newScroll:this.$element.scrollTop(),oldScroll:this.oldScroll.y,forward:"down",backward:"up"}};if(c&&(!t.vertical.oldScroll||!t.vertical.newScroll)){n[m]("refresh")}n.each(t,function(t,r){var i,o,l;l=[];o=r.newScroll>r.oldScroll;i=o?r.forward:r.backward;n.each(e.waypoints[t],function(t,e){var n,i;if(r.oldScroll<(n=e.offset)&&n<=r.newScroll){return l.push(e)}else if(r.newScroll<(i=e.offset)&&i<=r.oldScroll){return l.push(e)}});l.sort(function(t,e){return t.offset-e.offset});if(!o){l.reverse()}return n.each(l,function(t,e){if(e.options.continuous||t===l.length-1){return e.trigger([i])}})});return this.oldScroll={x:t.horizontal.newScroll,y:t.vertical.newScroll}};t.prototype.refresh=function(){var t,e,r,i=this;r=n.isWindow(this.element);e=this.$element.offset();this.doScroll();t={horizontal:{contextOffset:r?0:e.left,contextScroll:r?0:this.oldScroll.x,contextDimension:this.$element.width(),oldScroll:this.oldScroll.x,forward:"right",backward:"left",offsetProp:"left"},vertical:{contextOffset:r?0:e.top,contextScroll:r?0:this.oldScroll.y,contextDimension:r?n[m]("viewportHeight"):this.$element.height(),oldScroll:this.oldScroll.y,forward:"down",backward:"up",offsetProp:"top"}};return n.each(t,function(t,e){return n.each(i.waypoints[t],function(t,r){var i,o,l,s,f;i=r.options.offset;l=r.offset;o=n.isWindow(r.element)?0:r.$element.offset()[e.offsetProp];if(n.isFunction(i)){i=i.apply(r.element)}else if(typeof i==="string"){i=parseFloat(i);if(r.options.offset.indexOf("%")>-1){i=Math.ceil(e.contextDimension*i/100)}}r.offset=o-e.contextOffset+e.contextScroll-i;if(r.options.onlyOnScroll&&l!=null||!r.enabled){return}if(l!==null&&l<(s=e.oldScroll)&&s<=r.offset){return r.trigger([e.backward])}else if(l!==null&&l>(f=e.oldScroll)&&f>=r.offset){return r.trigger([e.forward])}else if(l===null&&e.oldScroll>=r.offset){return r.trigger([e.forward])}})})};t.prototype.checkEmpty=function(){if(n.isEmptyObject(this.waypoints.horizontal)&&n.isEmptyObject(this.waypoints.vertical)){this.$element.unbind([p,y].join(" "));return delete a[this.id]}};return t}();l=function(){function t(t,e,r){var i,o;r=n.extend({},n.fn[g].defaults,r);if(r.offset==="bottom-in-view"){r.offset=function(){var t;t=n[m]("viewportHeight");if(!n.isWindow(e.element)){t=e.$element.height()}return t-n(this).outerHeight()}}this.$element=t;this.element=t[0];this.axis=r.horizontal?"horizontal":"vertical";this.callback=r.handler;this.context=e;this.enabled=r.enabled;this.id="waypoints"+v++;this.offset=null;this.options=r;e.waypoints[this.axis][this.id]=this;s[this.axis][this.id]=this;i=(o=t.data(w))!=null?o:[];i.push(this.id);t.data(w,i)}t.prototype.trigger=function(t){if(!this.enabled){return}if(this.callback!=null){this.callback.apply(this.element,t)}if(this.options.triggerOnce){return this.destroy()}};t.prototype.disable=function(){return this.enabled=false};t.prototype.enable=function(){this.context.refresh();return this.enabled=true};t.prototype.destroy=function(){delete s[this.axis][this.id];delete this.context.waypoints[this.axis][this.id];return this.context.checkEmpty()};t.getWaypointsByElement=function(t){var e,r;r=n(t).data(w);if(!r){return[]}e=n.extend({},s.horizontal,s.vertical);return n.map(r,function(t){return e[t]})};return t}();d={init:function(t,e){var r;if(e==null){e={}}if((r=e.handler)==null){e.handler=t}this.each(function(){var t,r,i,s;t=n(this);i=(s=e.context)!=null?s:n.fn[g].defaults.context;if(!n.isWindow(i)){i=t.closest(i)}i=n(i);r=a[i.data(u)];if(!r){r=new o(i)}return new l(t,r,e)});n[m]("refresh");return this},disable:function(){return d._invoke(this,"disable")},enable:function(){return d._invoke(this,"enable")},destroy:function(){return d._invoke(this,"destroy")},prev:function(t,e){return d._traverse.call(this,t,e,function(t,e,n){if(e>0){return t.push(n[e-1])}})},next:function(t,e){return d._traverse.call(this,t,e,function(t,e,n){if(e<n.length-1){return t.push(n[e+1])}})},_traverse:function(t,e,i){var o,l;if(t==null){t="vertical"}if(e==null){e=r}l=h.aggregate(e);o=[];this.each(function(){var e;e=n.inArray(this,l[t]);return i(o,e,l[t])});return this.pushStack(o)},_invoke:function(t,e){t.each(function(){var t;t=l.getWaypointsByElement(this);return n.each(t,function(t,n){n[e]();return true})});return this}};n.fn[g]=function(){var t,r;r=arguments[0],t=2<=arguments.length?e.call(arguments,1):[];if(d[r]){return d[r].apply(this,t)}else if(n.isFunction(r)){return d.init.apply(this,arguments)}else if(n.isPlainObject(r)){return d.init.apply(this,[null,r])}else if(!r){return n.error("jQuery Waypoints needs a callback function or handler option.")}else{return n.error("The "+r+" method does not exist in jQuery Waypoints.")}};n.fn[g].defaults={context:r,continuous:true,enabled:true,horizontal:false,offset:0,triggerOnce:false};h={refresh:function(){return n.each(a,function(t,e){return e.refresh()})},viewportHeight:function(){var t;return(t=r.innerHeight)!=null?t:i.height()},aggregate:function(t){var e,r,i;e=s;if(t){e=(i=a[n(t).data(u)])!=null?i.waypoints:void 0}if(!e){return[]}r={horizontal:[],vertical:[]};n.each(r,function(t,i){n.each(e[t],function(t,e){return i.push(e)});i.sort(function(t,e){return t.offset-e.offset});r[t]=n.map(i,function(t){return t.element});return r[t]=n.unique(r[t])});return r},above:function(t){if(t==null){t=r}return h._filter(t,"vertical",function(t,e){return e.offset<=t.oldScroll.y})},below:function(t){if(t==null){t=r}return h._filter(t,"vertical",function(t,e){return e.offset>t.oldScroll.y})},left:function(t){if(t==null){t=r}return h._filter(t,"horizontal",function(t,e){return e.offset<=t.oldScroll.x})},right:function(t){if(t==null){t=r}return h._filter(t,"horizontal",function(t,e){return e.offset>t.oldScroll.x})},enable:function(){return h._invoke("enable")},disable:function(){return h._invoke("disable")},destroy:function(){return h._invoke("destroy")},extendFn:function(t,e){return d[t]=e},_invoke:function(t){var e;e=n.extend({},s.vertical,s.horizontal);return n.each(e,function(e,n){n[t]();return true})},_filter:function(t,e,r){var i,o;i=a[n(t).data(u)];if(!i){return[]}o=[];n.each(i.waypoints[e],function(t,e){if(r(i,e)){return o.push(e)}});o.sort(function(t,e){return t.offset-e.offset});return n.map(o,function(t){return t.element})}};n[m]=function(){var t,n;n=arguments[0],t=2<=arguments.length?e.call(arguments,1):[];if(h[n]){return h[n].apply(null,t)}else{return h.aggregate.call(null,n)}};n[m].settings={resizeThrottle:100,scrollThrottle:30};return i.load(function(){return n[m]("refresh")})})}).call(this);
\ No newline at end of file
<!doctype html>
<html>
<head>
<link rel="stylesheet" type="text/css" href="cursor.css" />
<script type="text/javascript" src="jquery-1.10.2.min.js"></script>
<script type="text/javascript" src="util.js"></script>
<script type="text/javascript" src="ofmeet.js"></script>
<script type="text/javascript" src="tinycolor.js"></script>
<script>
document.addEventListener('message', function (event)
{
window.parent.console.log("remote message", event);
});
document.addEventListener('set-content', function (event)
{
window.parent.console.log("remote set-content", event.detail);
});
OpenfireMeetings.getContent = function()
{
window.parent.console.log("remote getContent");
return null;
}
OpenfireMeetings.getPrintContent = function()
{
window.parent.console.log("remote getPrintContent");
return '<img src="http://londontopia.net/wp-content/uploads/2015/01/enhanced-buzz-wide-22194-1393580280-8.jpg"/>';
}
</script>
</head>
<body>
<img src="http://londontopia.net/wp-content/uploads/2015/01/enhanced-buzz-wide-22194-1393580280-8.jpg"/>
</body>
</html>
// Bordered & Pulled
// -------------------------
.@{fa-css-prefix}-border {
padding: .2em .25em .15em;
border: solid .08em @fa-border-color;
border-radius: .1em;
}
.pull-right { float: right; }
.pull-left { float: left; }
.@{fa-css-prefix} {
&.pull-left { margin-right: .3em; }
&.pull-right { margin-left: .3em; }
}
// Base Class Definition
// -------------------------
.@{fa-css-prefix} {
display: inline-block;
font-family: FontAwesome;
font-style: normal;
font-weight: normal;
line-height: 1;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
// Fixed Width Icons
// -------------------------
.@{fa-css-prefix}-fw {
width: (18em / 14);
text-align: center;
}
/*!
* Font Awesome 4.0.3 by @davegandy - http://fontawesome.io - @fontawesome
* License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
*/
@import "variables";
@import "mixins";
@import "path";
@import "core";
@import "larger";
@import "fixed-width";
@import "list";
@import "bordered-pulled";
@import "spinning";
@import "rotated-flipped";
@import "stacked";
@import "icons";
This diff is collapsed.
// Icon Sizes
// -------------------------
/* makes the font 33% larger relative to the icon container */
.@{fa-css-prefix}-lg {
font-size: (4em / 3);
line-height: (3em / 4);
vertical-align: -15%;
}
.@{fa-css-prefix}-2x { font-size: 2em; }
.@{fa-css-prefix}-3x { font-size: 3em; }
.@{fa-css-prefix}-4x { font-size: 4em; }
.@{fa-css-prefix}-5x { font-size: 5em; }
// List Icons
// -------------------------
.@{fa-css-prefix}-ul {
padding-left: 0;
margin-left: @fa-li-width;
list-style-type: none;
> li { position: relative; }
}
.@{fa-css-prefix}-li {
position: absolute;
left: -@fa-li-width;
width: @fa-li-width;
top: (2em / 14);
text-align: center;
&.@{fa-css-prefix}-lg {
left: -@fa-li-width + (4em / 14);
}
}
// Mixins
// --------------------------
.fa-icon-rotate(@degrees, @rotation) {
filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=@rotation);
-webkit-transform: rotate(@degrees);
-moz-transform: rotate(@degrees);
-ms-transform: rotate(@degrees);
-o-transform: rotate(@degrees);
transform: rotate(@degrees);
}
.fa-icon-flip(@horiz, @vert, @rotation) {
filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=@rotation, mirror=1);
-webkit-transform: scale(@horiz, @vert);
-moz-transform: scale(@horiz, @vert);
-ms-transform: scale(@horiz, @vert);
-o-transform: scale(@horiz, @vert);
transform: scale(@horiz, @vert);
}
/* FONT PATH
* -------------------------- */
@font-face {
font-family: 'FontAwesome';
src: url('@{fa-font-path}/fontawesome-webfont.eot?v=@{fa-version}');
src: url('@{fa-font-path}/fontawesome-webfont.eot?#iefix&v=@{fa-version}') format('embedded-opentype'),
url('@{fa-font-path}/fontawesome-webfont.woff?v=@{fa-version}') format('woff'),
url('@{fa-font-path}/fontawesome-webfont.ttf?v=@{fa-version}') format('truetype'),
url('@{fa-font-path}/fontawesome-webfont.svg?v=@{fa-version}#fontawesomeregular') format('svg');
// src: url('@{fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts
font-weight: normal;
font-style: normal;
}
// Rotated & Flipped Icons
// -------------------------
.@{fa-css-prefix}-rotate-90 { .fa-icon-rotate(90deg, 1); }
.@{fa-css-prefix}-rotate-180 { .fa-icon-rotate(180deg, 2); }
.@{fa-css-prefix}-rotate-270 { .fa-icon-rotate(270deg, 3); }
.@{fa-css-prefix}-flip-horizontal { .fa-icon-flip(-1, 1, 0); }
.@{fa-css-prefix}-flip-vertical { .fa-icon-flip(1, -1, 2); }
// Spinning Icons
// --------------------------
.@{fa-css-prefix}-spin {
-webkit-animation: spin 2s infinite linear;
-moz-animation: spin 2s infinite linear;
-o-animation: spin 2s infinite linear;
animation: spin 2s infinite linear;
}
@-moz-keyframes spin {
0% { -moz-transform: rotate(0deg); }
100% { -moz-transform: rotate(359deg); }
}
@-webkit-keyframes spin {
0% { -webkit-transform: rotate(0deg); }
100% { -webkit-transform: rotate(359deg); }
}
@-o-keyframes spin {
0% { -o-transform: rotate(0deg); }
100% { -o-transform: rotate(359deg); }
}
@-ms-keyframes spin {
0% { -ms-transform: rotate(0deg); }
100% { -ms-transform: rotate(359deg); }
}
@keyframes spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(359deg); }
}
// Stacked Icons
// -------------------------
.@{fa-css-prefix}-stack {
position: relative;
display: inline-block;
width: 2em;
height: 2em;
line-height: 2em;
vertical-align: middle;
}
.@{fa-css-prefix}-stack-1x, .@{fa-css-prefix}-stack-2x {
position: absolute;
left: 0;
width: 100%;
text-align: center;
}
.@{fa-css-prefix}-stack-1x { line-height: inherit; }
.@{fa-css-prefix}-stack-2x { font-size: 2em; }
.@{fa-css-prefix}-inverse { color: @fa-inverse; }
// Bordered & Pulled
// -------------------------
.#{$fa-css-prefix}-border {
padding: .2em .25em .15em;
border: solid .08em $fa-border-color;
border-radius: .1em;
}
.pull-right { float: right; }
.pull-left { float: left; }
.#{$fa-css-prefix} {
&.pull-left { margin-right: .3em; }
&.pull-right { margin-left: .3em; }
}
// Base Class Definition
// -------------------------
.#{$fa-css-prefix} {
display: inline-block;
font-family: FontAwesome;
font-style: normal;
font-weight: normal;
line-height: 1;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
// Fixed Width Icons
// -------------------------
.#{$fa-css-prefix}-fw {
width: (18em / 14);
text-align: center;
}
// Icon Sizes
// -------------------------
/* makes the font 33% larger relative to the icon container */
.#{$fa-css-prefix}-lg {
font-size: (4em / 3);
line-height: (3em / 4);
vertical-align: -15%;
}
.#{$fa-css-prefix}-2x { font-size: 2em; }
.#{$fa-css-prefix}-3x { font-size: 3em; }
.#{$fa-css-prefix}-4x { font-size: 4em; }
.#{$fa-css-prefix}-5x { font-size: 5em; }
// List Icons
// -------------------------
.#{$fa-css-prefix}-ul {
padding-left: 0;
margin-left: $fa-li-width;
list-style-type: none;
> li { position: relative; }
}
.#{$fa-css-prefix}-li {
position: absolute;
left: -$fa-li-width;
width: $fa-li-width;
top: (2em / 14);
text-align: center;
&.#{$fa-css-prefix}-lg {
left: -$fa-li-width + (4em / 14);
}
}
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment