text:
// Copyright 2014 The Oppia Authors. All Rights Reserved.
//
// 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.

/**
 * @fileoverview Controller for the conversation skin.
 */

// Note: This file should be assumed to be in an IIFE, and the constants below
// should only be used within this file.
var TIME_FADEOUT_MSEC = 100;
var TIME_HEIGHT_CHANGE_MSEC = 500;
var TIME_FADEIN_MSEC = 100;
var TIME_NUM_CARDS_CHANGE_MSEC = 500;

oppia.animation('.conversation-skin-animate-tutor-card-on-narrow', function() {
  var tutorCardLeft, tutorCardWidth, tutorCardHeight, oppiaAvatarLeft;
  var tutorCardAnimatedLeft, tutorCardAnimatedWidth;

  var beforeAddClass = function(element, className, done) {
    if (className !== 'ng-hide') {
      done();
      return;
    }
    var tutorCard = element;
    var supplementalCard = $('.conversation-skin-supplemental-card-container');
    var oppiaAvatar = $('.conversation-skin-oppia-avatar.show-tutor-card');
    oppiaAvatarLeft = supplementalCard.position().left +
                      supplementalCard.width() - oppiaAvatar.width();
    tutorCardLeft = tutorCard.position().left;
    tutorCardWidth = tutorCard.width();
    tutorCardHeight = tutorCard.height();

    if (tutorCard.offset().left + tutorCardWidth > oppiaAvatar.offset().left) {
      var animationLength = Math.min(
        oppiaAvatarLeft - tutorCard.offset().left,
        tutorCardWidth);
      tutorCardAnimatedLeft = tutorCardLeft + animationLength;
      tutorCardAnimatedWidth = tutorCardWidth - animationLength;
    } else {
      tutorCardAnimatedLeft = oppiaAvatarLeft;
      tutorCardAnimatedWidth = 0;
    }

    oppiaAvatar.hide();
    tutorCard.css({
      'min-width': 0
    });
    tutorCard.animate({
      left: tutorCardAnimatedLeft,
      width: tutorCardAnimatedWidth,
      height: 0,
      opacity: 1
    }, 500, function() {
      oppiaAvatar.show();
      tutorCard.css({
        left: '',
        width: '',
        height: '',
        opacity: '',
        'min-width': ''
      });
      done();
    });
  };

  var removeClass = function(element, className, done) {
    if (className !== 'ng-hide') {
      done();
      return;
    }
    var tutorCard = element;
    $('.conversation-skin-oppia-avatar.show-tutor-card').hide(0, function() {
      tutorCard.css({
        left: tutorCardAnimatedLeft,
        width: tutorCardAnimatedWidth,
        height: 0,
        opacity: 0,
        'min-width': 0
      });
      tutorCard.animate({
        left: tutorCardLeft,
        width: tutorCardWidth,
        height: tutorCardHeight,
        opacity: 1
      }, 500, function() {
        tutorCard.css({
          left: '',
          width: '',
          height: '',
          opacity: '',
          'min-width': ''
        });
        done();
      });
    });
  };

  return {
    beforeAddClass: beforeAddClass,
    removeClass: removeClass
  };
});

oppia.animation('.conversation-skin-animate-tutor-card-content', function() {
  var animateCardChange = function(element, className, done) {
    if (className !== 'animate-card-change') {
      return;
    }

    var currentHeight = element.height();
    var expectedNextHeight = $(
      '.conversation-skin-future-tutor-card ' +
      '.conversation-skin-tutor-card-content'
    ).height();

    // Fix the current card height, so that it does not change during the
    // animation, even though its contents might.
    element.css('height', currentHeight);

    jQuery(element).animate({
      opacity: 0
    }, TIME_FADEOUT_MSEC).animate({
      height: expectedNextHeight
    }, TIME_HEIGHT_CHANGE_MSEC).animate({
      opacity: 1
    }, TIME_FADEIN_MSEC, function() {
      element.css('height', '');
      done();
    });

    return function(cancel) {
      if (cancel) {
        element.css('opacity', '1.0');
        element.css('height', '');
        element.stop();
      }
    };
  };

  return {
    addClass: animateCardChange
  };
});

oppia.animation('.conversation-skin-animate-cards', function() {
  // This removes the newly-added class once the animation is finished.
  var animateCards = function(element, className, done) {
    var tutorCardElt = jQuery(element).find(
      '.conversation-skin-main-tutor-card');
    var supplementalCardElt = jQuery(element).find(
      '.conversation-skin-supplemental-card-container');

    if (className === 'animate-to-two-cards') {
      var supplementalWidth = supplementalCardElt.width();
      supplementalCardElt.css({
        width: 0,
        'min-width': '0',
        opacity: '0'
      });
      supplementalCardElt.animate({
        width: supplementalWidth
      }, TIME_NUM_CARDS_CHANGE_MSEC, function() {
        supplementalCardElt.animate({
          opacity: '1'
        }, TIME_FADEIN_MSEC, function() {
          supplementalCardElt.css({
            width: '',
            'min-width': '',
            opacity: ''
          });
          jQuery(element).removeClass('animate-to-two-cards');
          done();
        });
      });

      return function(cancel) {
        if (cancel) {
          supplementalCardElt.css({
            width: '',
            'min-width': '',
            opacity: ''
          });
          supplementalCardElt.stop();
          jQuery(element).removeClass('animate-to-two-cards');
        }
      };
    } else if (className === 'animate-to-one-card') {
      supplementalCardElt.css({
        opacity: 0,
        'min-width': 0
      });
      supplementalCardElt.animate({
        width: 0
      }, TIME_NUM_CARDS_CHANGE_MSEC, function() {
        jQuery(element).removeClass('animate-to-one-card');
        done();
      });

      return function(cancel) {
        if (cancel) {
          supplementalCardElt.css({
            opacity: '',
            'min-width': '',
            width: ''
          });
          supplementalCardElt.stop();

          jQuery(element).removeClass('animate-to-one-card');
        }
      };
    } else {
      return;
    }
  };

  return {
    addClass: animateCards
  };
});

oppia.directive('conversationSkin', [
  'UrlService', 'UrlInterpolationService',
  function(UrlService, UrlInterpolationService) {
    return {
      restrict: 'E',
      scope: {},
      link: function(scope) {
        var isIframed = UrlService.isIframed();
        scope.directiveTemplate = isIframed ?
          UrlInterpolationService.getDirectiveTemplateUrl(
            '/pages/exploration_player/' +
            'conversation_skin_embed_directive.html') :
          UrlInterpolationService.getDirectiveTemplateUrl(
            '/pages/exploration_player/' +
            'conversation_skin_directive.html');
      },
      template: '

',
      controller: [
        '$scope', '$timeout', '$rootScope', '$window', '$translate', '$http',
        '$location', 'MessengerService', 'ExplorationPlayerService',
        'UrlService', 'FocusManagerService', 'LearnerViewRatingService',
        'WindowDimensionsService', 'PlayerTranscriptService',
        'LearnerParamsService', 'PlayerPositionService',
        'ExplorationRecommendationsService', 'StatsReportingService',
        'siteAnalyticsService', 'ExplorationPlayerStateService',
        'CONTENT_FOCUS_LABEL_PREFIX', 'AlertsService',
        'CONTINUE_BUTTON_FOCUS_LABEL', 'EVENT_ACTIVE_CARD_CHANGED',
        'EVENT_NEW_CARD_AVAILABLE', 'EVENT_PROGRESS_NAV_SUBMITTED',
        'FatigueDetectionService', 'NumberAttemptsService',
        'PlayerCorrectnessFeedbackEnabledService',
        'RefresherExplorationConfirmationModalService',
        'EXPLORATION_SUMMARY_DATA_URL_TEMPLATE', 'INTERACTION_SPECS',
        'EVENT_NEW_CARD_OPENED', 'HintsAndSolutionManagerService',
        'AudioTranslationManagerService', 'EVENT_AUTOPLAY_AUDIO',
        'COMPONENT_NAME_FEEDBACK', 'AutogeneratedAudioPlayerService',
        function(
            $scope, $timeout, $rootScope, $window, $translate, $http,
            $location, MessengerService, ExplorationPlayerService,
            UrlService, FocusManagerService, LearnerViewRatingService,
            WindowDimensionsService, PlayerTranscriptService,
            LearnerParamsService, PlayerPositionService,
            ExplorationRecommendationsService, StatsReportingService,
            siteAnalyticsService, ExplorationPlayerStateService,
            CONTENT_FOCUS_LABEL_PREFIX, AlertsService,
            CONTINUE_BUTTON_FOCUS_LABEL, EVENT_ACTIVE_CARD_CHANGED,
            EVENT_NEW_CARD_AVAILABLE, EVENT_PROGRESS_NAV_SUBMITTED,
            FatigueDetectionService, NumberAttemptsService,
            PlayerCorrectnessFeedbackEnabledService,
            RefresherExplorationConfirmationModalService,
            EXPLORATION_SUMMARY_DATA_URL_TEMPLATE, INTERACTION_SPECS,
            EVENT_NEW_CARD_OPENED, HintsAndSolutionManagerService,
            AudioTranslationManagerService, EVENT_AUTOPLAY_AUDIO,
            COMPONENT_NAME_FEEDBACK, AutogeneratedAudioPlayerService) {
          $scope.CONTINUE_BUTTON_FOCUS_LABEL = CONTINUE_BUTTON_FOCUS_LABEL;
          // The minimum width, in pixels, needed to be able to show two cards
          // side-by-side.
          var TIME_PADDING_MSEC = 250;
          var TIME_SCROLL_MSEC = 600;
          var MIN_CARD_LOADING_DELAY_MSEC = 950;

          var hasInteractedAtLeastOnce = false;
          $scope.answerIsBeingProcessed = false;
          var _nextFocusLabel = null;
          // This variable is used only when viewport is narrow.
          // Indicates whether the tutor card is displayed.
          var tutorCardIsDisplayedIfNarrow = true;

          $scope.explorationId = ExplorationPlayerService.getExplorationId();
          $scope.isInPreviewMode = ExplorationPlayerService.isInPreviewMode();
          $scope.isIframed = UrlService.isIframed();
          $rootScope.loadingMessage = 'Loading';
          $scope.hasFullyLoaded = false;
          $scope.recommendedExplorationSummaries = null;
          $scope.answerIsCorrect = false;
          $scope.pendingCardWasSeenBefore = false;
          $scope.isCorrectnessFeedbackEnabled = function() {
            return PlayerCorrectnessFeedbackEnabledService.isEnabled();
          };

          $scope.isCorrectnessFooterEnabled = function() {
            return (
              $scope.answerIsCorrect && $scope.isCorrectnessFeedbackEnabled() &&
              PlayerPositionService.hasLearnerJustSubmittedAnAnswer());
          };

          $scope.isLearnAgainButton = function() {
            var interaction = ExplorationPlayerService.getInteraction(
              $scope.activeCard.stateName);
            if (INTERACTION_SPECS[interaction.id].is_linear) {
              return false;
            }
            return (
              $scope.pendingCardWasSeenBefore && !$scope.answerIsCorrect &&
              $scope.isCorrectnessFeedbackEnabled());
          };

          $scope.OPPIA_AVATAR_IMAGE_URL = (
            UrlInterpolationService.getStaticImageUrl(
              '/avatar/oppia_avatar_100px.svg'));
          $scope.getStaticImageUrl = (
            UrlInterpolationService.getStaticImageUrl);

          $scope.activeCard = null;
          var numVisibleCards = 0;

          $scope.upcomingStateName = null;
          $scope.upcomingContentHtml = null;
          $scope.upcomingInlineInteractionHtml = null;

          $scope.DEFAULT_TWITTER_SHARE_MESSAGE_PLAYER =
            GLOBALS.DEFAULT_TWITTER_SHARE_MESSAGE_PLAYER;

          $scope.getContentFocusLabel = function(index) {
            return CONTENT_FOCUS_LABEL_PREFIX + index;
          };

          // If the exploration is iframed, send data to its parent about its
          // height so that the parent can be resized as necessary.
          $scope.lastRequestedHeight = 0;
          $scope.lastRequestedScroll = false;
          $scope.adjustPageHeight = function(scroll, callback) {
            $timeout(function() {
              var newHeight = document.body.scrollHeight;
              if (Math.abs($scope.lastRequestedHeight - newHeight) > 50.5 ||
                  (scroll && !$scope.lastRequestedScroll)) {
                // Sometimes setting iframe height to the exact content height
                // still produces scrollbar, so adding 50 extra px.
                newHeight += 50;
                MessengerService.sendMessage(MessengerService.HEIGHT_CHANGE, {
                  height: newHeight,
                  scroll: scroll
                });
                $scope.lastRequestedHeight = newHeight;
                $scope.lastRequestedScroll = scroll;
              }

              if (callback) {
                callback();
              }
            }, 100);
          };

          $scope.reloadExploration = function() {
            $window.location.reload();
          };

          $scope.isOnTerminalCard = function() {
            return $scope.activeCard &&
              ExplorationPlayerStateService.isStateTerminal(
                $scope.activeCard.stateName);
          };

          var isSupplementalCardNonempty = function(card) {
            return !ExplorationPlayerStateService.isInteractionInline(
              card.stateName);
          };

          $scope.isCurrentSupplementalCardNonempty = function() {
            return $scope.activeCard && isSupplementalCardNonempty(
              $scope.activeCard);
          };

          $scope.isSupplementalNavShown = function() {
            var interaction = ExplorationPlayerService.getInteraction(
              $scope.activeCard.stateName);
            return (
              Boolean(interaction.id) &&
              INTERACTION_SPECS[interaction.id].show_generic_submit_button &&
              $scope.isCurrentCardAtEndOfTranscript());
          };

          // Navigates to the currently-active card, and resets the
          // 'show previous responses' setting.
          var _navigateToActiveCard = function() {
            $rootScope.$broadcast(EVENT_ACTIVE_CARD_CHANGED);
            $scope.$broadcast(EVENT_AUTOPLAY_AUDIO);
            /* A hash value is added to URL for scrolling to Oppia feedback
               when answer is submitted by user in mobile view. This hash value
               has to be reset each time a new card is loaded to prevent
               unwanted scrolling in the new card. */
            $location.hash(null);
            $scope.pendingCardWasSeenBefore = false;
            // We must cancel the autogenerated audio player here, or else a
            // bug where the autogenerated audio player generates duplicate
            // utterances occurs.
            AutogeneratedAudioPlayerService.cancel();
            var index = PlayerPositionService.getActiveCardIndex();
            $scope.activeCard = PlayerTranscriptService.getCard(index);
            tutorCardIsDisplayedIfNarrow = true;
            if (_nextFocusLabel && PlayerTranscriptService.isLastCard(index)) {
              FocusManagerService.setFocusIfOnDesktop(_nextFocusLabel);
            } else {
              FocusManagerService.setFocusIfOnDesktop(
                $scope.getContentFocusLabel(index));
            }
          };

          var animateToTwoCards = function(doneCallback) {
            $scope.isAnimatingToTwoCards = true;
            $timeout(function() {
              $scope.isAnimatingToTwoCards = false;
              if (doneCallback) {
                doneCallback();
              }
            }, TIME_NUM_CARDS_CHANGE_MSEC + TIME_FADEIN_MSEC +
              TIME_PADDING_MSEC);
          };

          var animateToOneCard = function(doneCallback) {
            $scope.isAnimatingToOneCard = true;
            $timeout(function() {
              $scope.isAnimatingToOneCard = false;
              if (doneCallback) {
                doneCallback();
              }
            }, TIME_NUM_CARDS_CHANGE_MSEC);
          };

          $scope.isCurrentCardAtEndOfTranscript = function() {
            return PlayerTranscriptService.isLastCard(
              PlayerPositionService.getActiveCardIndex());
          };
          var _addNewCard = function(
              stateName, newParams, contentHtml, interactionHtml) {
            PlayerTranscriptService.addNewCard(
              stateName, newParams, contentHtml, interactionHtml);

            if (newParams) {
              LearnerParamsService.init(newParams);
            }

            numVisibleCards++;

            var totalNumCards = PlayerTranscriptService.getNumCards();

            var previousSupplementalCardIsNonempty = (
              totalNumCards > 1 &&
              isSupplementalCardNonempty(
                PlayerTranscriptService.getCard(totalNumCards - 2)));
            var nextSupplementalCardIsNonempty = isSupplementalCardNonempty(
              PlayerTranscriptService.getLastCard());

            if (
              totalNumCards > 1 &&
              ExplorationPlayerService.canWindowShowTwoCards() &&
              !previousSupplementalCardIsNonempty &&
              nextSupplementalCardIsNonempty) {
              PlayerPositionService.setActiveCardIndex(numVisibleCards - 1);
              animateToTwoCards(function() {});
            } else if (
              totalNumCards > 1 &&
              ExplorationPlayerService.canWindowShowTwoCards() &&
              previousSupplementalCardIsNonempty &&
              !nextSupplementalCardIsNonempty) {
              animateToOneCard(function() {
                PlayerPositionService.setActiveCardIndex(numVisibleCards - 1);
              });
            } else {
              PlayerPositionService.setActiveCardIndex(numVisibleCards - 1);
            }

            if (ExplorationPlayerStateService.isStateTerminal(stateName)) {
              $scope.isRefresherExploration = false;
              $scope.parentExplorationIds =
                UrlService.getQueryFieldValuesAsList('parent');
              var recommendedExplorationIds = [];
              var includeAutogeneratedRecommendations = false;

              if ($scope.parentExplorationIds.length > 0) {
                $scope.isRefresherExploration = true;
                var parentExplorationId = $scope.parentExplorationIds[
                  $scope.parentExplorationIds.length - 1];
                recommendedExplorationIds.push(parentExplorationId);
              } else {
                recommendedExplorationIds =
                  ExplorationPlayerStateService.getAuthorRecommendedExpIds(
                    stateName);
                includeAutogeneratedRecommendations = true;
              }

              ExplorationRecommendationsService.getRecommendedSummaryDicts(
                recommendedExplorationIds,
                includeAutogeneratedRecommendations,
                function(summaries) {
                  $scope.recommendedExplorationSummaries = summaries;
                });
            }
          };

          $scope.initializePage = function() {
            hasInteractedAtLeastOnce = false;
            $scope.recommendedExplorationSummaries = null;

            PlayerPositionService.init(_navigateToActiveCard);
            ExplorationPlayerService.init(function(
                exploration, initHtml, newParams) {
              ExplorationPlayerStateService.setExploration(exploration);
              $scope.isLoggedIn = ExplorationPlayerService.isLoggedIn();
              _nextFocusLabel = FocusManagerService.generateFocusLabel();

              _addNewCard(
                exploration.initStateName,
                newParams,
                initHtml,
                ExplorationPlayerService.getInteractionHtml(
                  exploration.initStateName, _nextFocusLabel));
              $rootScope.loadingMessage = '';
              $scope.hasFullyLoaded = true;

              // If the exploration is embedded, use the exploration language
              // as site language. If the exploration language is not supported
              // as site language, English is used as default.
              var langCodes = constants.SUPPORTED_SITE_LANGUAGES.map(
                function(language) {
                  return language.id;
                });
              if ($scope.isIframed) {
                var explorationLanguageCode = (
                  ExplorationPlayerService.getExplorationLanguageCode());
                if (langCodes.indexOf(explorationLanguageCode) !== -1) {
                  $translate.use(explorationLanguageCode);
                } else {
                  $translate.use('en');
                }
              }
              $scope.adjustPageHeight(false, null);
              $window.scrollTo(0, 0);
              FocusManagerService.setFocusIfOnDesktop(_nextFocusLabel);

              // The timeout is needed in order to give the recipient of the
              // broadcast sufficient time to load.
              $timeout(function() {
                $rootScope.$broadcast(EVENT_NEW_CARD_OPENED, {
                  stateName: exploration.initStateName
                });
              });
            });
          };

          $scope.submitAnswer = function(answer, interactionRulesService) {
            // Safety check to prevent double submissions from occurring.
            if ($scope.answerIsBeingProcessed ||
              !$scope.isCurrentCardAtEndOfTranscript() ||
              $scope.activeCard.destStateName) {
              return;
            }

            if (!$scope.isInPreviewMode) {
              FatigueDetectionService.recordSubmissionTimestamp();
              if (FatigueDetectionService.isSubmittingTooFast()) {
                FatigueDetectionService.displayTakeBreakMessage();
                $scope.$broadcast('oppiaFeedbackAvailable');
                return;
              }
            }
            NumberAttemptsService.submitAttempt();

            $scope.answerIsBeingProcessed = true;
            hasInteractedAtLeastOnce = true;

            var _oldStateName = PlayerTranscriptService.getLastCard().stateName;
            PlayerTranscriptService.addNewInput(answer, false);

            var timeAtServerCall = new Date().getTime();
            PlayerPositionService.recordAnswerSubmission();

            $scope.answerIsCorrect = ExplorationPlayerService.submitAnswer(
              answer, interactionRulesService, function(
                  newStateName, refreshInteraction, feedbackHtml,
                  feedbackAudioTranslations, contentHtml, newParams,
                  refresherExplorationId) {
                // Do not wait if the interaction is supplemental -- there's
                // already a delay bringing in the help card.
                var millisecsLeftToWait = (
                  !ExplorationPlayerStateService.isInteractionInline(
                    _oldStateName) ? 1.0 :
                  Math.max(MIN_CARD_LOADING_DELAY_MSEC - (
                    new Date().getTime() - timeAtServerCall),
                  1.0));

                $timeout(function() {
                  $scope.$broadcast('oppiaFeedbackAvailable');
                  var pairs = (
                    PlayerTranscriptService.getLastCard().inputResponsePairs);
                  var lastAnswerFeedbackPair = pairs[pairs.length - 1];
                  $scope.$broadcast(EVENT_AUTOPLAY_AUDIO, {
                    audioTranslations: feedbackAudioTranslations,
                    html: feedbackHtml,
                    componentName: COMPONENT_NAME_FEEDBACK
                  });

                  if (_oldStateName === newStateName) {
                    // Stay on the same card.
                    HintsAndSolutionManagerService.recordWrongAnswer();

                    PlayerTranscriptService.addNewResponse(feedbackHtml);
                    if (feedbackHtml &&
                        !ExplorationPlayerStateService.isInteractionInline(
                          $scope.activeCard.stateName)) {
                      $scope.$broadcast('helpCardAvailable', {
                        helpCardHtml: feedbackHtml,
                        hasContinueButton: false
                      });
                    }
                    if (refreshInteraction) {
                      // Replace the previous interaction with another of the
                      // same type.
                      _nextFocusLabel =
                        FocusManagerService.generateFocusLabel();
                      PlayerTranscriptService.updateLatestInteractionHtml(
                        ExplorationPlayerService.getInteractionHtml(
                          newStateName, _nextFocusLabel) +
                        ExplorationPlayerService.getRandomSuffix());
                    }

                    $scope.redirectToRefresherExplorationConfirmed = false;

                    if (refresherExplorationId) {
                      // TODO(bhenning): Add tests to verify the event is
                      // properly recorded.
                      var confirmRedirection = function() {
                        $scope.redirectToRefresherExplorationConfirmed = true;
                        ExplorationPlayerService.recordLeaveForRefresherExp(
                          newStateName, refresherExplorationId);
                      };
                      $http.get(EXPLORATION_SUMMARY_DATA_URL_TEMPLATE, {
                        params: {
                          stringified_exp_ids: JSON.stringify(
                            [refresherExplorationId])
                        }
                      }).then(function(response) {
                        if (response.data.summaries.length > 0) {
                          RefresherExplorationConfirmationModalService.
                            displayRedirectConfirmationModal(
                              refresherExplorationId, confirmRedirection);
                        }
                      });
                    }
                    FocusManagerService.setFocusIfOnDesktop(_nextFocusLabel);
                    scrollToBottom();
                  } else {
                    // There is a new card. If there is no feedback, move on
                    // immediately. Otherwise, give the learner a chance to read
                    // the feedback, and display a 'Continue' button.
                    FatigueDetectionService.reset();
                    NumberAttemptsService.reset();
                    _nextFocusLabel = FocusManagerService.generateFocusLabel();

                    PlayerTranscriptService.setDestination(newStateName);

                    // These are used to compute the dimensions for the
                    // next card.
                    $scope.upcomingStateName = newStateName;
                    $scope.upcomingParams = newParams;
                    $scope.upcomingContentHtml = (
                      contentHtml + ExplorationPlayerService.getRandomSuffix());

                    var _isNextInteractionInline = (
                      ExplorationPlayerStateService.isInteractionInline(
                        newStateName));
                    $scope.upcomingInlineInteractionHtml = (
                      _isNextInteractionInline ?
                        ExplorationPlayerService.getInteractionHtml(
                          newStateName, _nextFocusLabel
                        ) + ExplorationPlayerService.getRandomSuffix() : '');
                    $scope.upcomingInteractionInstructions = (
                      ExplorationPlayerStateService.getInteractionInstructions(
                        $scope.upcomingStateName));

                    if (feedbackHtml) {
                      var stateHistory =
                        PlayerTranscriptService.getStateHistory();
                      if (stateHistory.indexOf(newStateName) !== -1) {
                        $scope.pendingCardWasSeenBefore = true;
                      }
                      PlayerTranscriptService.addNewResponse(feedbackHtml);
                      if (!ExplorationPlayerStateService.isInteractionInline(
                        $scope.activeCard.stateName)) {
                        $scope.$broadcast('helpCardAvailable', {
                          helpCardHtml: feedbackHtml,
                          hasContinueButton: true
                        });
                      }
                      $rootScope.$broadcast(EVENT_NEW_CARD_AVAILABLE);
                      _nextFocusLabel = $scope.CONTINUE_BUTTON_FOCUS_LABEL;
                      FocusManagerService.setFocusIfOnDesktop(_nextFocusLabel);
                      scrollToBottom();
                    } else {
                      PlayerTranscriptService.addNewResponse(feedbackHtml);
                      // If there is no feedback, it immediately moves on
                      // to next card. Therefore $scope.answerIsCorrect needs
                      // to be set to false before it proceeds to next card.
                      $scope.answerIsCorrect = false;
                      $scope.showPendingCard(
                        newStateName,
                        newParams,
                        contentHtml +
                        ExplorationPlayerService.getRandomSuffix());
                    }
                  }
                  $scope.answerIsBeingProcessed = false;
                }, millisecsLeftToWait);
              }
            );
          };
          $scope.startCardChangeAnimation = false;
          $scope.showPendingCard = function(
              newStateName, newParams, newContentHtml) {
            $scope.startCardChangeAnimation = true;

            $timeout(function() {
              var newInteractionHtml =
                ExplorationPlayerService.getInteractionHtml(
                  newStateName, _nextFocusLabel);
              // Note that newInteractionHtml may be null.
              if (newInteractionHtml) {
                newInteractionHtml +=
                  ExplorationPlayerService.getRandomSuffix();
              }

              _addNewCard(
                newStateName, newParams, newContentHtml, newInteractionHtml);

              $scope.upcomingStateName = null;
              $scope.upcomingParams = null;
              $scope.upcomingContentHtml = null;
              $scope.upcomingInlineInteractionHtml = null;
              $scope.upcomingInteractionInstructions = null;
            }, TIME_FADEOUT_MSEC + 0.1 * TIME_HEIGHT_CHANGE_MSEC);

            $timeout(function() {
              FocusManagerService.setFocusIfOnDesktop(_nextFocusLabel);
              scrollToTop();
            },
            TIME_FADEOUT_MSEC + TIME_HEIGHT_CHANGE_MSEC +
              0.5 * TIME_FADEIN_MSEC);

            $timeout(function() {
              $scope.startCardChangeAnimation = false;
            },
            TIME_FADEOUT_MSEC + TIME_HEIGHT_CHANGE_MSEC + TIME_FADEIN_MSEC +
            TIME_PADDING_MSEC);

            $rootScope.$broadcast(EVENT_NEW_CARD_OPENED, {
              stateName: newStateName
            });
          };

          $scope.showUpcomingCard = function() {
            /* This is for the following situation:
               if A->B->C is the arrangement of cards and C redirected to A,
               then after this, B and C are visited cards and hence
               pendingCardWasSeenBefore would be true during both these
               transitions and as answerIsCorrect is set to false below,
               Continue would briefly change to Learn Again (after it is
               clicked) during these transitions which is not required.
               Also, if the 'if' check is not there, Learn Again button would
               briefly switched to Continue before going to next card. */
            if ($scope.answerIsCorrect) {
              $scope.pendingCardWasSeenBefore = false;
            }
            $scope.answerIsCorrect = false;
            $scope.showPendingCard(
              $scope.upcomingStateName, $scope.upcomingParams,
              $scope.upcomingContentHtml);
          };

          var scrollToBottom = function() {
            $timeout(function() {
              var tutorCard = $('.conversation-skin-main-tutor-card');

              if (tutorCard.length === 0) {
                return;
              }
              var tutorCardBottom = (
                tutorCard.offset().top + tutorCard.outerHeight());
              if ($(window).scrollTop() +
                    $(window).height() < tutorCardBottom) {
                $('html, body').animate({
                  scrollTop: tutorCardBottom - $(window).height() + 12
                }, {
                  duration: TIME_SCROLL_MSEC,
                  easing: 'easeOutQuad'
                });
              }
            }, 100);
          };

          var scrollToTop = function() {
            $timeout(function() {
              $('html, body').animate({
                scrollTop: 0
              }, 800, 'easeOutQuart');
              return false;
            });
          };

          $scope.submitUserRating = function(ratingValue) {
            LearnerViewRatingService.submitUserRating(ratingValue);
          };
          $scope.$on('ratingUpdated', function() {
            $scope.userRating = LearnerViewRatingService.getUserRating();
          });

          $window.addEventListener('beforeunload', function(e) {
            if ($scope.redirectToRefresherExplorationConfirmed) {
              return;
            }
            if (hasInteractedAtLeastOnce && !$scope.isInPreviewMode &&
                !ExplorationPlayerStateService.isStateTerminal(
                  PlayerTranscriptService.getLastCard().stateName)) {
              StatsReportingService.recordMaybeLeaveEvent(
                PlayerTranscriptService.getLastStateName(),
                LearnerParamsService.getAllParams());
              var confirmationMessage = (
                'If you navigate away from this page, your progress on the ' +
                'exploration will be lost.');
              (e || $window.event).returnValue = confirmationMessage;
              return confirmationMessage;
            }
          });

          $scope.canWindowShowTwoCards = function() {
            return ExplorationPlayerService.canWindowShowTwoCards();
          };

          $window.onresize = function() {
            $scope.adjustPageHeight(false, null);
          };

          $window.addEventListener('scroll', function() {
            fixSupplementOnScroll();
          });

          var fixSupplementOnScroll = function() {
            var supplementCard = $('div.conversation-skin-supplemental-card');
            var topMargin = $('.navbar-container').height() - 20;
            if ($(window).scrollTop() > topMargin) {
              supplementCard.addClass(
                'conversation-skin-supplemental-card-fixed');
            } else {
              supplementCard.removeClass(
                'conversation-skin-supplemental-card-fixed');
            }
          };

          $scope.initializePage();
          LearnerViewRatingService.init(function(userRating) {
            $scope.userRating = userRating;
          });

          $scope.collectionId = GLOBALS.collectionId;
          $scope.collectionTitle = GLOBALS.collectionTitle;
          $scope.collectionSummary = null;

          if ($scope.collectionId) {
            $http.get('/collectionsummarieshandler/data', {
              params: {
                stringified_collection_ids: JSON.stringify(
                  [$scope.collectionId])
              }
            }).then(
              function(response) {
                $scope.collectionSummary = response.data.summaries[0];
              },
              function() {
                AlertsService.addWarning(
                  'There was an error while fetching the collection summary.');
              }
            );
          }

          $scope.onNavigateFromIframe = function() {
            siteAnalyticsService.registerVisitOppiaFromIframeEvent(
              $scope.explorationId);
          };

          // Interaction answer validity is used to enable/disable
          // the progress-nav's Submit button. This logic is here because
          // Interactions and the progress-nav are both descendants
          // of ConversationSkinDirective.
          $scope.interactionAnswerIsValid = true;
          $scope.setInteractionAnswerValidity = function(answerValidity) {
            $scope.interactionAnswerIsValid = answerValidity;
          };

          $scope.submitAnswerFromProgressNav = function() {
            $scope.$broadcast(EVENT_PROGRESS_NAV_SUBMITTED);
          };
        }
      ]
    };
  }]);

redpajama_set_name: RedPajamaGithub


text:
And the Senate follows suit
It might be summer, but things are certainly not slowing down in education and student privacy. Last week the Senate, following the House's vote, passed a rewrite of the ESEA by a pretty big 81-17 margin. This is significant in the fact that the ESEA reauthorization gives us an opportunity to purposely use student data to help us all (parents, students, schools, policymakers) make informed decisions about our children's education. I find it particularly interesting that lawmakers are taking such a keen interest in student data and privacy but I do hope that the intent is to promote the effective use of data and not hinder its use.
In addition to the ESEA, there are several other bills from both House and Senate about student privacy, and what caught my attention is that for the most part, the focus is on protecting student data while at the same time allowing for the use of data and technology. For example, Sen. Richard Blumenthal (D-Conn) and Sen. Steve Daines (R-Mont) introduced theSAFE KIDS Act. What this Act would do is prohibit ed-tech companies from selling student data, using the information for targeted advertising or disclosing information to unapproved third parties. Noteworthy in this bill is that it requires providers of services to publicly disclose their privacy policies and provide notice before making material changes to such policies. What I would very much like is a provision asking for such privacy policies to be written concisely and in plain simple language so that we can all understand them but….wishful thinking….
In short, the SAFE KIDS Act would provide student data protections without discouraging service providers from creating innovative educational products that could help improve student learning and teaching. But while all these protections and collaborative efforts are important, we fall short if we continue to fail to include student voices in the process. We must acknowledge that the use of data in education is not only for apps and ed-tech products to be developed and used. Student voices need to be heard when groups of learners are being discriminated against because of the lack of student data. You see, educational data is not only about one student or a group of students and their educational achievements or use of technology. Educational data can help us identify students that need help in different areas and help facilitate the diversion of services to them, for example how are homeless children or those in foster care doing in school? Are we providing adequate support services for them to increase the graduation rates in this vulnerable group? What can we, as a society, do to support children who need additional resources so that we can provide to them the best education possible and the opportunity of success in their future? How are we analyzing the outcomes of different groups of students, and are we providing the services they require? All of these would not be possible without student data.
I encourage lawmakers to continue to work on protecting student privacy as it will only help further the debate and encourage others to follow suit. I appreciate the trend different bills are promoting in encouraging tech companies to voluntarily agree to a pledge to protect student information. They are all important efforts but we cannot forget that there is a greater purpose in protecting student data – and that is helping all students not just a few.
As the summer continues and the new school year approaches, I couldn't think of better summer reading than the different bills proposed to protect student privacy. All children deserve the right to reach their full potential, but we can only help do so with complete information at our disposal. It can be done, we just need to be smart about it.
FPF's Student Privacy Newsletter – April 2021
Apr 5, 2021Bailey Sanchez and Amelia Vance
Good afternoon, and welcome to another issue of FPF's Student Privacy Newsletter! Below, we've rounded up noteworthy student privacy issues that surfaced…
FPF's Student Privacy Newsletter – January 2021
Good afternoon, and welcome to another year of FPF's Student Privacy Newsletter! Below, we've rounded up noteworthy student privacy issues that surfaced in Dec…
Student Data Privacy Interview Series: Back to School with Undergraduate Students: Northeast Private Liberal Arts College Senior
Feb 3, 2021Alexis Shore
COVID-19 has placed undergraduate institutions in unprecedented circumstances as they attempt to balance health concerns and academic responsibilities, without…

redpajama_set_name: RedPajamaCommonCrawl


The Seacoast Chapter is entirely run by volunteers and funded by direct donations to the chapter. In other words, none of our board members are paid and we do not receive money from NH Audubon or any other source. Our expenses include: funding programs, providing snacks at programs, supporting the Seacoast Science Center for providing our meeting space, special projects (bluebird house maintenance, Purple Martin Colony maintenance, bird migration research) and field trips (field trips with a cost are absorbed by participants).


One way to boost our water supply is to think of it as one resource, whether it's from wastewater, reuse, drinking water, or stormwater. That integrated approach to water management is called One Water.
As Brown and Caldwell's Lisa Skutecki explains in this "Water Talk" podcast with host Todd Schnick and Water Online Chief Editor Kevin Westerling, the Blueprint for One Water, developed with the Water Research Foundation, outlines the steps to plan and implement this innovative, more resilient method.
"It's the concept of breaking down barriers across the water sector to think about it in a more holistic way," Lisa says in the podcast recorded at the 2018 Water Environment Federation Technical Exhibition & Conference (WEFTEC).
Listen to the podcast (10 minutes, 10 seconds) here.


Best known in the art world for his wearable sculptures Soundsuits, the singer, artist and writer Nick Cave unveiled at Massachusetts Museum of Contemporary Art (Mass MOCA) an immersive installation entitled Until, a strong visual manifesto on racism, violence and humanity.
"I had been thinking about gun violence and racism colliding. And then I wondered: Is there racism in heaven? That's how this piece came about," said Cave.
Until is, as the artist emphasized, a visual expression of the popular phrase "innocent until proven guilty" or in this case "guilty until proven innocent", an extensive installation on discrimination based on gender or race.
Nick Cave's installation is a kaleidoscopic universe that begins with an oasis of scattered lawn ornaments that leads to a dream-like crystal cloud topped by a garden populated by flowers, birds and chandeliers that give way to a complex net made out of hand-woven shoelaces and pony beads. After passing through this fairy-tale like areas, the viewer is immersed in a space made out of violent images of targets, guns and bullets in which one feels in danger of an imminent attack.
Cave's Until installation will be on display at Mass MoCA until August 2017.
Posted in UncategorizedTagged installation, Massachusetts Museum of Contemporary Art, nick cave, soundsuits, untilBookmark the permalink.


text:
Q: Getting the ID of an HTML Control I have these in my aspx page:
<input runat="server" name="btnSubmit" id="btnSubmit" value="Submit" type="submit" OnServerClick="ibtn_Click"  />
<input runat="server" name="btnCancel" id="btnCancel" value="Cancel" type="submit" OnServerClick="ibtn_Click" />

And in code behind inside the method "ibtn_Click" I added this line to get the id of a particular button:
HtmlGenericControl btn = sender as HtmlGenericControl;

But I got an error saying "Use the 'new' keyword to create an object instance."

A: Try this:
protected void ibtn_Click(object sender, EventArgs e)
{
        HtmlInputButton input = (HtmlInputButton)sender as HtmlInputButton;
        string ControlID = input.ID.ToString();
}

redpajama_set_name: RedPajamaStackExchange


text:
Facts So Romantic On Numbers
How a Defense of Christianity Revolutionized Brain Science
Posted By Jordana Cepelewicz on Dec 20, 2016
Image by Waiting For The Word / Flickr
Presbyterian reverend Thomas Bayes had no reason to suspect he'd make any lasting contribution to humankind. Born in England at the beginning of the 18th century, Bayes was a quiet and questioning man. He published only two works in his lifetime. In 1731, he wrote a defense of God's—and the British monarchy's—"divine benevolence," and in 1736, an anonymous defense of the logic of Isaac Newton's calculus. Yet an argument he wrote before his death in 1761 would shape the course of history. It would help Alan Turing decode the German Enigma cipher, the United States Navy locate Soviet subs, and statisticians determine the authorship of the Federalist Papers. Today it has helped unlock the secrets of the brain.
It all began in 1748, when the philosopher David Hume published An Enquiry Concerning Human Understanding, calling into question, among other things, the existence of miracles. According to Hume, the probability of people inaccurately claiming that they'd seen Jesus' resurrection far outweighed the probability that the event had occurred in the first place. This did not sit well with the reverend.
Inspired to prove Hume wrong, Bayes tried to quantify the probability of an event. He came up with a simple fictional scenario to start: Consider a ball thrown onto a flat table behind your back. You can make a guess as to where it landed, but there's no way to know for certain how accurate you were, at least not without looking. Then, he says, have a colleague throw another ball onto the table and tell you whether it landed to the right or left of the first ball. If it landed to the right, for example, the first ball is more likely to be on the left side of the table (such an assumption leaves more space to the ball's right for the second ball to land). With each new ball your colleague throws, you can update your guess to better model the location of the original ball. In a similar fashion, Bayes thought, the various testimonials to Christ's resurrection suggested the event couldn't be discounted the way Hume asserted.
In 1767, Richard Price, Bayes' friend, published "On the Importance of Christianity, its Evidences, and the Objections which have been made to it," which used Bayes' ideas to mount a challenge to Hume's argument. "The basic probabilistic point" of Price's article, says statistician and historian Stephen Stigler, "was that Hume underestimated the impact of there being a number of independent witnesses to a miracle, and that Bayes' results showed how the multiplication of even fallible evidence could overwhelm the great improbability of an event and establish it as fact."
The statistics that grew out of Bayes and Price's work became powerful enough to account for wide ranges of uncertainties. In medicine, Bayes' theorem helps measure the relationship between diseases and possible causes. In battle, it narrows the field to locate an enemy's position. In information theory, it can be applied to decrypt messages. And in the brain, it helps make sense of sensory input processes.
The application of Bayes' theorem to the brain began in the late 19th century. German physicist Hermann von Helmholtz used Bayes' ideas to introduce the idea of converting sensory data like, say, spatial awareness, into information through a process he called "unconscious inference." As Bayesian statistics gained popularity, the idea that unconscious mental calculations are probabilistic in nature didn't seem so farfetched. According to the "Bayesian brain hypothesis," the brain constantly uses Bayesian inference to "fill in" missing sensory information, just as each successive ball thrown on the table in Bayes' thought experiment "fills in" information about the location of the first ball. The "Bayesian brain" has an internal model of the world—expectations (or hypotheses) about how objects should look, feel, sound, behave, and interact—that takes in sensory input and constructs, to a certain approximation, what's actually happening around us.
Take vision. Light bounces off objects surrounding us and hits the surface of the retina, and somehow the brain must generate a three-dimensional image from that two-dimensional data. Many three-dimensional scenes could be generated from it, so how does the brain decide which to show you? Perhaps it's using a Bayesian model to do so. But for the brain to have evolved to make such near-perfect statistical computations seems unlikely. Our computers can't handle performing the enormous number of probabilistic calculations we seem to be making every moment. Maybe the brain can't either. According to one theory, called sampling, the brain may be approximating Bayesian inference: Rather than simultaneously representing all hypotheses that explain a given sensory input, it takes into account only a few hypotheses sampled randomly (the number of times each hypothesis is sampled is based on its prior likelihood of occurrence).
That might explain why we experience visual illusions the way we do: The brain makes a "best guess" according to the rules of Bayesian inference—one that ends up being incorrect because the visual system fills in missing details by sampling from an internal model that doesn't apply. Two squares on a chess board appear to be different shades of gray, for example, or a circle seems concave at first but becomes convex when flipped 180 degrees, because the brain makes a wrong initial assumption about something as simple as lighting.
It also helps explain why people—and their recollections, impressions, decisions—are more heavily influenced by early information they receive, says Adam Sanborn, a behavioral scientist at the University of Warwick. People implicitly prefer to buy goods from the first salesperson they meet. Gamblers may be more likely to continue to play at the slot machine if they experience early winnings that day. And first impressions are often difficult to shake, even if they're dead wrong. "With the first information you get," Sanborn says, "you'll think of hypotheses that are consistent with that information."
This variability takes place all the way down on the neuronal level. "The idea is that the activity of a neuron represents the value of a random variable you're trying to infer," says Máté Lengyel, a computational neuroscientist at the University of Cambridge. In other words, the variability of a neuron's activity describes an event's probability. Consider a simplified example, a neuron that represents "tiger," he says. The neuron will fluctuate between two activity levels: sometimes high, signaling the tiger is there, and sometimes low, meaning there's no tiger. The fraction of the time the neuron spends in the high activity state approximates the probability of the tiger's presence. "Essentially, in this case we can say the neuron's activity is sampling from the distribution that needs to be represented," Lengyel says. "It turns out that if you pursue this idea in a more realistic, less simplistic way, it captures a lot of the things we know about neurons and the variability in their responses."
In some sense, says Thomas Hills, one of Sanborn's colleagues, the way we sample from mental representations is similar to how we forage for physical objects in space. If you have most often found milk in the back of a supermarket, that's the first place you'll look when buying milk at a new store. It's no different when it comes down to searching through the internal representations housed in the mind. "You can think of memories as some kind of record of the rational frequency of events in the world," Hills says. "They're encoded in your mental representation in proportion to the extent you've experienced them in the past. So if I ask you about your relationship with your mom, you may go: I have this memory of a good interaction, this memory of a good interaction, this memory of a bad interaction. But on average the memories that come to mind are good, so you'd answer 'good.'" The brain is a kind of search engine that samples from memories to build what Hills calls our "belief structures"—about our ties with our parents, about how we define "dog" or "friend" or "love," about everything.
And if this search process goes wrong—if the brain retrieves information from samples that aren't representative of a person's experience, if there's mismatch between expectation and sensory input—it can lead to depression, obsessive-compulsive disorder, PTSD, or a number of other illnesses.
This is not to say that the Bayesian brain hypothesis doesn't have critics. "I think the Bayesian framework as a sort of mathematical language is a really powerful and useful way of expressing psychological theories," says Matt Jones, a cognitive neuroscientist at the University of Colorado Boulder. "But it's important to think about what parts of the theory are really doing the explanation." He thinks Bayesian brain proponents give too much credit to the statistical-analysis part of the theory. "That by itself doesn't explain a lot of behavior," he says. "It's only meaningful when you couple it with what turns out to be rich assumptions about the nature of knowledge representation—how we organize concepts, search through memory, and use knowledge to do reasoning and problem solving."
In other words, the claims we make about psychological processing—what traditional cognitive science is all about—inform how Bayesian statistics is applied to the brain's functions. The model expresses those theories in the language of mathematics, but old-fashioned psychology is doing the actual explaining. It may end up being the case that other, non-Bayesian models—or different Bayesian models—are a better fit for the assortment of mental processes that underlie our sensory perceptions and higher cognition.
While Sanborn might disagree with Jones' opinions on the Bayesian brain hypothesis, he also believes the next step is to narrow down the models that work. "You can say that sampling itself is a useful way to conceive of what the brain is trying to do," he says, "but there are a lot of samplers out there." Whether those samplers are Bayesian remains to be seen. What is apparent is that Bayes' defense of Christianity in the 18th century has helped scientists make great strides through the 21st century.
Jordana Cepelewicz is an editorial fellow at Nautilus.
Watch: The neuroscientist Christof Koch explains how a computer or the Internet could be conscious.
5 Comments - Join the Discussion
043: Heroes
Our better selves
Why Presidential Elections Aren't Really About the Candidates
Political pundits have had some explaining to do since the Presidential election. FiveThirtyEight's Nate Silver and other analysts have come under fire…
Why Blind People Are Better at Math
Bernard Morin developed glaucoma at an early age and was blind by the time he was six years old. Despite his inability to see, Morin went on to become…
An "Infinitely Rich" Mathematician Turns 100
At the Hotel Parco dei Principi in Rome, in September of 1973, the Hungarian mathematician Paul Erdős approached his friend Richard Guy with a request.…
Today Is "Galactic Tick Day"!
Nearly a quarter of Americans still believe in Ptolemy's idea that the sun goes around Earth. Yet, every year, these people presumably cheer on December…


When Danger Threatens The Galaxy It`s Mars McCoy to The Rescue!
Move aside, Flash Gordon. Shove over, Buck Rogers. Here comes the newest space hero of them all, Captain Marshall Mars McCoy of the Space Rangers. Created by the writers of the Pulp Factory, this new rocket blasting hero and his Space Rangers blast off to new heights of action and adventure from Airship 27 Productions & Cornerstone Book Publishers.
Working from their secret asteroid base known as the Black Hole, the Space Rangers are an elite band of men, women, robots and aliens, banded together to patrol the lawless and ever dangerous sections of the space known as the Frontier Worlds. Their daring and heroic exploits in their sleek, super fast Black Birds blaze a glorious path across the stars.
Here are three brand new stories of Mars and his gorgeous robotic co-pilot, Betty 12, as they face off against overwhelming odds to preserve the peace and defend the Galactic Empire. Writers John Bear Ross, Greg Gick and Andrew Salmon have whipped up kidnapping pirate aliens, body snatching spores and a giant, invading space behemoth to challenge Mars and his allies. From page one, the action blasts-off and goes into orbit, featuring a stunning cover by ace artist Chad Hardin, with a dozen marvelous illustrations by Michael Youngblood.
MARS McCOY " Space Ranger is a bold new trip into the reaches of the imagination. So, buckle up pulp fans, for star-spanning thrills and excitement as only Airship 27 Productions can deliver. Pulp Fiction for a New Generation!
Cornerstone Book Publishers also publishes Masonic and esoteric books, selected pulp fiction, art literature, limited children`s books, and poetry collections. The first two novels are available on-line, at book stores, from Cornerstone, and as E-books. For more information about Cornerstone, go to www.cornerstonepublishers.com.
Airship 27 packages and publishes anthologies and novels in the pulp magazine tradition.
In the past, Airship 27 has released Sherlock Holmes: Consulting Detective ", Weird Horror Tales " and Weird Horror Tales: The Feasting ", The Green Lama " and Secret Agent X ". For more information on Airship 27, go to www.airship27.com.


This picture shows the hardship of the children working in coal mines during the 19th and early 20th century Industrial Revolution. Children were often used in mines because they had smaller bodies that could fit more easily and they often were much less expensive to employ. This is an "American Image" because this is a prime example in depicting the poor conditions of industries at the time.
Historical Context:The age of industrialization began in the United States around the 1770s with the cotton gin. The Industrialization was a transition to more efficient laboring with the rise of new methods and machinery. Three major developments during this time were textiles, the use of steam power, and iron. With the rise of these technological advancements there was also a rise of a serious problem, child labor.
During the industrial revolution, textile industry implemented new power looms and spinning mules replacing skilled worker thus factory owners began using cheap, unskilled labor to decrease their cost in production. These child laborers, some as young as four years old, were paid a mere tenth of what the men were being paid. Another benefit factory owners saw was that these children did not go on strike or join labor unions. Beatings, long hours, and treacherous working conditions were common.
Some children worked more than twelve hours straight in just a single day. Children working in mines at the time faced death everyday, some were killed when they dozed off in the path of a cart while some were killed in gas explosions. Many of these young workers developed terminal illnesses like lung cancer before they reached the age of 25. Quite a few children lived in workhouses where they would be sold to factories and receive food and a place to sleep in return. These children would be sold to factories as "pauper apprentices", working without any pay in terrible conditions. Those who attempted to run away were often whipped and shackled to prevent any future escape.
As child labor became a seriously notable issue in industries, many people worked towards creating and reforming child labor laws. At first politicians tried to reduce overall child labor with laws but factory owners paid no attention to these laws. The first effective law passed was in 1833 with the Factory Act, limiting the amount of hours a child of a certain age could work. Children under the age of 9 could not work at all, children ages 9-13 could work up to eight hours a day, 14-18 could work 12 hours a day but all children were required to attend school no less than two hours a day. These laws were enforced with factory inspections but the scarcity of these inspectors made enforcement difficult to execute. Laws and reformations like these reduced child labor but child labor remained in both Europe and the United States up to the 20th century. Global labor reform continues today throughout Asia.
It's crazy to think that children had to put up with harsh working conditions. I can't even imagine what it would be like if children were still allowed to work today. Nice job on your research!


Parliament has called on the Government of Canada to take action to end the devastating social and environmental impacts of Canadian mining operations overseas.
A recent Parliamentary report calls on the Government to: (i) stop using taxpayer money to support destructive Canadian mining projects abroad; (ii) hold Canadian mining companies legally accountable for environmental and human rights violations in other countries, and; (iii) force the World Bank and the International Monetary Fund to respect international human rights standards.
The Government has about 60 days left to respond and, not surprisingly, it would like nothing more than to sweep the report under the carpet. So, like most of the good things that happen, the changes demanded will only take place as the result of many people's efforts. Our participation is needed, as always, to pressure the Government to adopt Parliament's recommendations and to address ongoing international scandals associated with the Canadian mining industry.
What can we do to help make this happen? The websites of Friends of the Earth Canada and Mining Watch have a lot of info on these issues and ways to take action.
Fernando lived in Argentina for almost 30 years, studying biology and working as little as possible, when he decided to use money he got from a bad bad corporation that laid him off to go for a year-long trip around the world. The end of the trip found him ready to get married to a Canadian, balder, and less interested in biology. Now he lives in Toronto. He is now a father, which will do for a happy biography ending.
← Do You Have a Cancer Phone?


your present prescription. I keep mine in medical file in my own filing cabinet. If you cannot find your prescription, visit wherever you latest had your eye examined and require a copy. Your optician, optometrist, or ophthalmologist is necessary by law to release your eyewear prescription to you. You now need to make note of a few critical bits of information from your prescription (see example above–click to enlarge). Among other information, you should see three columns on your prescription–sphere, cylinder, and axis.
A relatively less critical amount is your temple span. If you're blessed, you'll also visit a temple span and bridge size in your prescription. If not, don't sweat it, you can determine it out yourself. The temple size describes the distance of both bars that hook up the glasses to your ears. It really is measured from where in fact the 90-degree curve from your lens structure aside bars (temples) starts to the end of the temple, like the curve. It is not assessed from the flex point of the temples, because the "stub" between your flex point and zoom lens structure is not a standard size.
Now, remove some measuring tape (ideally the type of tape used for appropriate clothes and sewing, as it is very flexible) and assess an existing couple of spectacles that fit easily. The average temple duration for men is 135mm or 145mm. For females, 130mm to 140mm is standard. If your tape only has ins, measure to the nearest eighth or sixteenth and multiply that number by 25.4 to get the dimension in millimeters. Temple measures are generally available in 5mm increments, such as 130, 135, 140, 145, etc. For the most part online eyeglasses stores, temple period is shown inside a frame description which is not customizable. Therefore, you need to discover a frame with a proper temple size. This sometimes varies if you are at a site focusing on designer spectacles, where you have the choice to input your own temple size.
Actually, temple size is not a huge deal. I have one couple of glasses with 135mm temples and another with 140mm temples. Both pairs fit comfortably. If for some reason you can't think of a temple measurement, don't allow that stop you from making an eyewear purchase online. Instead, simply choose 140mm temples if you are a guy and 135mm temples if you are a female. It's likely that, this span will fit pleasantly.


text:
<!-- Auto Generated Below -->

## Properties

| Property         | Attribute          | Description | Type     | Default     |
| ---------------- | ------------------ | ----------- | -------- | ----------- |
| `parentFolderId` | `parent-folder-id` |             | `number` | `undefined` |

## Dependencies

### Used by

 - [dnn-rm-actions-bar](../../dnn-rm-actions-bar)
 - [dnn-rm-folder-context-menu](../../context-menus/dnn-rm-folder-context-menu)

### Depends on

- dnn-modal
- [dnn-rm-create-folder](../../dnn-rm-create-folder)

### Graph
```mermaid
graph TD;
  dnn-action-create-folder --> dnn-modal
  dnn-action-create-folder --> dnn-rm-create-folder
  dnn-rm-create-folder --> dnn-button
  dnn-button --> dnn-modal
  dnn-button --> dnn-button
  dnn-rm-actions-bar --> dnn-action-create-folder
  dnn-rm-folder-context-menu --> dnn-action-create-folder
  style dnn-action-create-folder fill:#f9f,stroke:#333,stroke-width:4px
```

----------------------------------------------

*Built with [StencilJS](https://stenciljs.com/)*


text:
JC/DC ACTION ALERT: Charter School Expansion
Please contact your Senators and House Representatives now and ask them to OPPOSE these Charter School Expansion Bills!
SB 292 will be placed on the Senate calendar and could be taken up soon by the Senate.
HB 581 could also soon be on the House calendar and would also allow charter schools to be sponsored by outside entities other than a local school board and operate in districts state-wide.
**ACTION NEEDED: PLEASE CALL OR E-MAIL** and urge your State Senators and State Representatives to oppose the charter school expansion bills.
National and Missouri PTA do recognize and support charter schools when they are public and have to meet all the same evaluation standards that a non-charter public schools must meet. However, Missouri PTA opposes these bills based on the fact that it is allowing the charter schools to be sponsored by entities other than local Public School Board and expands their operation state-wide.
HB 581 Letter:
As a community we prioritize the education standards of our kids. We have evaluation standards that must be met for public schools to remain accredited. HB 581 allows for the formation of charter schools in any district in the state. Under this bill, these schools could be controlled by non-public organizations and sponsored by outside entities. These schools would not have to be held to the same evaluation standards non-charter public schools are held. This would allow for the potential for children to not have the quality of education they receive in Missouri public schools. Missouri PTA is not against charter schools when they are under the control nonprofit organizations not affiliated with non-public sectarian, religious, or home-based school organizations of the local school district with the same standards as public schools. HB 581 fails to meet this requirement.
Please oppose HB 581.
SB 292 Letter:
As a community we prioritize the education standards of our kids. We have evaluation standards that must be met for public schools to remain accredited. SB 292 allows for the formation of charter schools in any district in the state. Under this bill, these schools could be controlled by non-public organizations and sponsored by outside entities. These schools would not have to be held to the same evaluation standards non-charter public schools are held. This would allow for the potential for children to not have the quality of education they receive in Missouri public schools. Missouri PTA is not against charter schools when they are under the control nonprofit organizations not affiliated with non-public sectarian, religious, or home-based school organizations of the local school district with the same standards as public schools. SB 292 fails to meet this requirement.
Please oppose SB 292.
KristinaW@mopta.org


alverdowath01 (#658) 392 days ago News dentist near 75023 All http://www.shifadental.net 2 Comments Published New Discard Success!
Like to know more about Dentist office near me visit this site http://www.shifadental.net/ for more information.
Like to know more about Deep Cleaning Plano visit this site http://www.shifadental.net/ for more information.


If you are having the issue with "Unknown USB Device" in Windows or the device is not being detected at all. Run this utility and it will fix the issue.
** This will only work on the TrackIR 3 and 4 models!
This tool looks for entries in the users computer related to NaturalPoint USB devices and attempts to fix problems that may have occurred during the windows installation of the devices and USB drivers.
Note that it is necessary to have the relevant NaturalPoint software installed for your hardware in order for this tool to work properly (i.e. TrackIR 4 software for TrackIR hardware).
NaturalPoint provides this tool with no warranty and support for users who may have experienced USB installation issues and wish to resolve the problem on their own without the assistance of NaturalPoint technical support. Use of this tool is done at the users own risk and NaturalPoint will not be held liable for any issues which may occur as a result of its use.


Baroness (Jenny) Tonge has this afternoon resigned the Lib Dem whip after coming under intense pressure following the widespread reporting of remarks she made last week declaring that Israel "will reap what they have sown" once the USA gets "sick of giving £70bn a year to Israel to support what I call America's aircraft carrier in the Middle East".
She was sacked by then leader Charles Kennedy as the Lib Dem children's spokeswoman in the Commons in 2004 after she suggested she could consider becoming a Palastinian suicide bomber.
In 2010, Ming's successor Nick Clegg sacked Baroness Tonge as the Lib Dems' health spokeswoman in the Lords after she apologised unreservedly for disseminating unsubstantiated claims that Israeli troops sent to Haiti after its earthquake were trafficking organs.
However, in the afternoon it emerged Nick Clegg had delivered an ultimatum that either she should withdraw and apologise for her comments, or have the Lib Dem whip removed. Baroness Tonge decided she would not apologise, and so resigned the whip herself (and I understand may have resigned from the party itself, though I don't know that for sure).
There's a strong sense in the party's highest echelons today that she has been given more than enough second chances, and that her repeated inflammatory interventions are damaging the party's position on a highly sensitive issue.


text:
Explorers Might Be About to Unbury a Nazi Gold Train
Posted on August 15, 2016 by Blake Hall
A lost train filled to the brim with filthy Nazi gold from more than 70 years ago may be more than a flimsy tall tale, reprised by two men out of nowhere who claimed to have solid evidence, last year. According to a few researchers, not only may it be real — if it is, they say — they're about to find it.
This from the Washington Post:
One year after claiming to have traced it, a team of 35 researchers that includes Piotr Koper and Andreas Richter will start digging for it Tuesday morning. A report they worked on found that soil anomalies could hint at the train's existence, but another study — by the AGH University of Science and Technology in Krakow, Poland — found no evidence for that. The latter study, though, concluded that a tunnel may be at the location where Koper and Richter will now put their theory to the test.
The committee consists of volunteers rather than Polish officials, who refrained from participating in the search efforts.
The story of a Nazi-era train with valuable art, gems and gold that disappeared at the end of World War II in 1945 has circulated for decades. It is thought to have been last seen near the city of Wroclaw, which is today part of Poland, and researchers and hunters have been unable to find the tunnel complex in which it is thought to be hidden.
While there is concrete, radar printouts of vehicles down in the area where the old, infamous tunnel once was, they may be just a series of rusty tanks. Or, they could be a line of track cars housing more than 300 tons of the most coveted mineral on the planet — so says a Polish media outlet.
The origin of this mysterious, incalculable haul is rooted in one of the worst atrocities in human history.
Again, from WaPo:
… the history of Nazi gold is well documented. Using jewelry from Jews and other prisoners who had been sent to concentration camps, the Nazis melted the metal into ingots. When Allied forces advanced at the end of World War II, the Nazis transported that gold back to Germany amid fears that it might fall into Soviet hands. Experts say that not all of it has been found.
Stay tuned to the blog for any further developments regarding this bizarre story.


text:
Only 10 of the ACC's 14 teams (Syracuse does not field a baseball team) make the league tournament. If it began today, UNC would be among the last teams in. The Tar Heels' perilous position in the conference standings raises the significance of their upcoming final three ACC series.
The first of those begins Friday with a three-game homestand against Louisville, a consensus top 10 team that leads the ACC in both batting average and earned run average. Louisville presents UNC with one of its most significant challenges but also with important opportunities.
UNC with a strong performance this weekend could bolster its postseason resume. The Tar Heels could also build momentum and further distance themselves from the disappointment they often experienced in April, when they lost 11 of 19 games.
"It's no secret that April was a tough one for us, for sure," Cody Roberts, a freshman catcher, said earlier this week. "We came out really hot (to start the season) but I think these past three games, we've really just kind of taken a step back and said, you know what, we've got to regain our focus here."
There are indicators UNC did that. After losing three consecutive games in late April at Wake Forest in their most recent ACC series, the Tar Heels responded with three consecutive victories – all of them in mid-week games, against UNCW, Campbell and VCU.
Fox liked what he saw, in particular, during UNC's 11-0 victory against VCU on Tuesday. He said he was "proud" of his team, and he's confident that this season the Tar Heels are better equipped to handle challenging stretches than they were last year, when leadership lacked.
"We definitely didn't have good leadership last year," Fox said. "So if you don't have good leadership, it costs you. It costs you in every area.
"... The ultimate cost to us was not making the (NCAA) tournament, obviously, but there are things that go on all throughout the season that lead up to that final decision that's made by the committee."
Zac Gallen, a junior pitcher whom Fox designated as a team captain, said he and his teammates didn't even gather to watch the NCAA tournament selection show last year. They knew.
The Tar Heels had built a tradition of annual NCAA tournament trips, and frequent ones to a Super Regional and the College World Series. And then a long streak came to an end. UNC a season ago failed to reach the NCAA tournament for the first time since 2001.
The disappointment of making that kind of dubious history has stuck with the players who experienced it. Those memories are still motivating, Gallen said, and the struggles at the end of last season made him and his teammates say, "Enough of that."
"You don't want to leave here with your legacy being (that you) went to a regional one year out of three – especially when you play at a place like this, with such prestigious tradition," Gallen said.
In some ways that's what this season has been about, for Gallen and others: getting the program back to where they believe it belongs. The next three weekends – with series against Lousiville, Notre Dame and N.C. State – will go a long ways toward determining UNC's ability to achieve that goal.
The Tar Heels have been waiting for this opportunity – another ACC series, and one that happens to be against one of the best teams in the country – since suffering that three-game sweep at Wake Forest. And now it's arrived, perhaps the most important series of the season to this point.
"It's kind of like, all right, let's go on a roll now," said Gallen, UNC's No. 1 pitcher. "Enough messing around. It's time to go."
Andrew Carter: 919-829-8944, acarter@newsobserver.com, @_andrewcarter
UNC fencing coach Ron Miller expresses gratitude after 52 years at the helm
World Cup star Megan Rapinoe brings victory tour to House of Soccer in Charlotte
By Brendan Marks
USWNT captain, World Cup soccer player Megan Rapinoe will attend Relevent Sports Group's House of Soccer fan festival on July 20 and the International Champions Cup game between Arsenal and Fiorentina.
MORE NORTH CAROLINA
7-foot shark nearly sliced in half as it grew with a plastic strap around its gills
North Carolina defensive back suffers season-ending injury
'He is the program.' UNC's first and only fencing coach retires after 52 years.
Sylvia Hatchell, hosting camp at UNC, denies allegations that led to her departure
North Carolina basketball to play Alabama in Battle 4 Atlantis tournament


alright nah…i c 'em. lookin' real nice!!
Girl has it been that long? You look fab as usual!!
Thanks everyone and yeah Serving Christ…it's been that long! lol Good to see everyone and hope you all are doing well.
Very pretty I have been stalking your blog for a while. I finally started my braidlocks and I am so excited. I have watched most of your youtube videos and started using your recipes.
LOL@ Sashalocz! I'm so glad that what I've shared so far has been helpful to you.
You have such beautiful hair. The amount of time you put in to you hair shows. It looks professional.
Thank you! Lately locs have been mistaken for Sisterlocks a lot. I'm already quite proud of my hair but that makes me even more proud of it.
I suppose every ethnic group has pros and cons when it comes to hair. At least your hair is strong enough to do just about anything you want to it. That is a definite plus in my book!
Oh I wish it were strong. Afro textured hair has so many twists and turns that it makes our hair quite fragile. Every turning point is a potential breaking point. My hair cannot take a lot of heat or chemicals and even though it's natural it's still prone to breakage. Keeping it chemical free helps.
Wow! I never knew that. I always thought it was much stronger than Caucasian hair. I take a diuretic for a heart condition which pulls all the moisture out of my face and hair. I have to be so careful about using ponytail holders and barrettes. I keep my hair short because it just breaks off anyway.
We have to take the same precautions with hair accessories and in particular the standard accepted way of hair care. Hence the natural hair movement that has been underway for the last few years. I kept my hair short for years for the very same reason as you. Making changes in my hair care have made all the difference in retaining length.


A prolific author, highly successful political activist and a lecturer; words fall short to describe the personality of Helen Keller. A person who was not blessed with the gift of vision and hearing, Helen surpassed all odds to obtain Bachelor of Arts degree. Her life is an epitome of perseverance and inner strength. Helen was extremely fond of nature and it is very evident in all her works. Helen's quotes motivate us to be optimistic in life and encourage us to do every small work with equal passion and zeal.
"True happiness is not attained through self-gratification, but through fidelity to a worthy purpose."
"What a blind person needs is not a teacher but another self"


text:
Gas price fallout: People trading in hybrids for SUVs
by Peter Valdes-Dapena @peterdrives April 22, 2015: 3:52 AM ET
Cheap gas reignites SUV love affair
With gas prices low, more people are trading in their hybrid and electric cars for purely gasoline-powered vehicles, including SUVs.
So far this year, only 45% of people that traded in an environmentally-friendly hybrid car purchased another, according statisticians at Edmunds.com. In 2012, that figure was over 60% and this is the first time it has ever fallen below 50%.
"For better or worse, it looks like many hybrid and EV owners are driven more by financial motives rather than a responsibility to the environment," Edmunds.com Director of Industry Analysis Jessica Caldwell said in a statement.
Three years ago, when gas prices were at near-record highs, Caldwell said more people were willing to pay a premium for the "alternative fuel vehicles."
Back in 2012, gas prices peaked at $4.67 a gallon. At that price, it would take five years for owners of a hybrid-powered Toyota (TM) Camry to make up for the $3,770 price differential with the brand's gasoline-powered model. But with today's gas prices at $2.27 a gallon, it would take about 11 years.
Land Rover: Go off-roading at a castle
Sales have fallen for brand new alternative fuel vehicles. In the first quarter of 2015, new hybrid car sales was only 2.7% of the market. That's down from 3.3% in the same period last year.
Besides the lack of economic incentives, there's not much social incentive to purchase a hybrid car anymore, Caldwell said. The technology has become more mainstream, and a hybrid badge on the trunklid doesn't make a statement anymore.
"You've lost the specialness and you're paying a price," she said.
Photos - Consumer Reports: Most reliable cars
Also, non-hybrid cars and SUVs have become much more fuel efficient. These days, many compact cars can get 35 miles per gallon or more on the highway, according to EPA estimates. Also, the fastest growing portion of the SUV market is compact and even subcompact models. Those are vehicles like the Fiat Chrysler' (FCAM)s Jeep Renegade and General Motors' (GM) Chevrolet Trax, both of which get over 30 mpg on the highway.
"For a lot of people, that's enough," said Caldwell.
CNNMoney (New York) First published April 21, 2015: 1:13 PM ET


I think this error is caused by the filepath being too long (the file is stored on a Linux machine with a very deep directory structure, see attache log file). I do this quite frequently so everytime I have to click away the error message. Is there a way I can disable the watching of files in the options? I looked but couldn't find anything.
Another suggestion: Instead of replicating the filepath in the temporary directory (which I think winscp tries to do) winscp could create a hash of the filepath and save the temporary file using that hash.
Or am I getting this all wrong and the cause is something entirely different?
Awesome, thanks a lot. That works! I really appreciate the fast response.


text:
Tulane Vs. SMU Final Score: Mustangs Power Their Way To 45-24 Win
By Kris Willis@Kris_Willis Nov 5, 2011, 5:14pm CDT
Share All sharing options for: Tulane Vs. SMU Final Score: Mustangs Power Their Way To 45-24 Win
Zach Line and J.J. McDermott combined for six touchdowns as SMU successfully snapped a two game losing streak with a 44-24 win over Tulane. The victory moves the Mustangs to 6-3 overall and 4-2 in Conference USA.
The Mustangs jumped out to an early 14-0 lead after one on a touchdown run by Zach Line and a J.J. McDermott touchdown pass to Der'rikk Thompson. The lead would grow to 31-0 by halftime as Line and McDermott again added touchdowns and Chase Hover nailed a 32 yard field goal.
Tulane came out in the second half and made things interesting right away scoring 17 unanswered points. The Green Wave finally got on the board as Dominique Robertson ran in a Zach Line fumble to make the score 31-7. Tulane would further cut into the lead on a Cairo Santos 42 yard field goal and a Ryan Griffin to Wilson Van Hooser touchdown reception to make the score 31-17. The teams exchanged touchdowns at the end of the quarter to enter the fourth with TCU leading 38-24.
McDermott put the nail in the coffin in the fourth when he capped off a 12 play, 75 yard drive with a touchdown pass to Terrance Wilkerson to make the score 45-24.
McDermott finished 29 of 40 for 322 yards and three touchdowns. Zach Line ran for 143 yards and three touchdowns of his own. Darius Johnson hauled in seven catches for 135 yards and a score. Ryan Griffin threw for 214 yards and two scores for the Green Wave.
Tulane Vs. SMU Final Score: Zach Line Powers Mustangs to 45-24 Win
Tulane Vs. SMU Game Time, Radio Broadcast And More


At Pest Management, Inc., we offer our customers the very best in pest and bed bug control at every step in the process.
Our Pest Management employees are highly trained in providing expert care to eradicate the problem at hand, and we take the time to thoroughly understand clients' needs in every unique case.
We utilize top-of-the-line equipment and materials and employ well-tested protocols and practices. Our motto is "Get it Done Right the First Time" and we always guarantee our services and provide our clients with peace of mind.
Green and eco-friendly options are always available, too. Give us a call today and talk with one of our trained pest control experts to see how we can help your home or business remain pest-free.


text:
Contessa Metcalfe: "I Squash People Like You for Fun"
Dr. Contessa and Toya Bush-Harris clash again when Toya accuses Contessa's husband of lying.
Show Highlight Contessa Metcalfe: "I Squash People Like You for Fun"
Preview Simone Whitmore Walks Out on Her Husband
Preview Heavenly Kimes Has a Sit Down with Mariah Huq...
Contessa Metcalfe
Contessa Metcalfe was born and raised in Kansas City, MO. She grew up being involved in every activity imaginable from debutante to cheerleader to even being crowned as her high school homecoming queen. Dr. Contessa attended Xavier University where she earned her undergraduate degree and for medical school she attended St. Louis University. While in St. Louis, Contessa knew she had a calling beyond medicine along with an inner desire to do more and she decided to join the Navy as a flight surgeon. During her residency at the National Naval Medical Center, she also learned to how to fly planes. Dr. Contessa's adventurous personality allowed her to travel the world and while on the road she fell in love and decided to settle down with her husband, Scott. Contessa now focuses on occupational and preventive medicine in addition to owning a medical concierge service called Acute Face MD where she provides VIP services for her patients. She also owns a TCBY Frozen Yogurt Café in Atlanta, and is a real estate entrepreneur. When Dr. Metcalfe is not on the clock she enjoys riding motorcycles, traveling, and spending quality time with her family. She and her husband, Scott have three kids and she considers them her heart, soul, and by far her greatest accomplishment. Contessa lives by the motto, "Prevention is the key to healthy living."


SITTING ROOM Oak flooring, two double glazed window to the rear and door onto the patio garden, two radiators, cornicing and wall uplighters.
KITCHEN Comprehensively fitted with a range of high gloss units to both wall and base. The base units are contrasted by granite worksurface with matching upstands. Undercounter 1 1/2 bowl sink unit. Built in dishwasher, fridge freezer, washing machine and tumble dryer, double oven, hob and extractor canopy. Double glazed window to the side.
LANDING Stairs rising to the first floor and all doors off to.
BEDROOM 2 Double glazed window to the side and a radiator.
BEDROOM 3 Double glazed window to the side and a radiator.
BEDROOM 4 Double glazed window to the rear and a radiator.
BEDROOM 1 Velux window to the fore.
OUTSIDE A rear courtyard garden and parking bay.


Mary Beth Leatherdale is a seasoned veteran of children's publishing, having written, edited, and consulted on children's books, magazines, and educational resources for more than twenty-five years. She was a founding editor of Chirp, Canada's first pre-school magazine, and the editor of OWL magazine. As Editorial Director at Owlkids, Mary Beth oversaw the publishing program for Chirp, chickaDEE,and OWL, as well as the development of a number of award-winning books. She was the Senior Acquisitions Editor for McGraw-Hill Ryerson's iLit Digital Collection, developing an online bank of original works by leading Canadian authors for high school English students. Recently, she edited Legends, Icons & Rebels by Grammy-award winner Robbie Robertson and music industry veterans Jim Guerinot, Sebastian Robertson, and Jared Levine.
Mary Beth's interest in Indigenous issues developed early while attending Howard Harwich Moravian Public School (now called the Naahi Ridge Public School) with students from the Delaware Nation at Moraviantown. (Local legend contends that the school offered the first Native studies program in Ontario.) After completing her Honours BA in Visual Arts at The University of Western Ontario, she went on to pursue a Master of Education in the Sociology of Education, from the Ontario Institute of Studies in Education (OISE). Her research focused on anti‐racist policy, delivery of anti‐racist curricula, and the impact on children's perceptions of race and ethnicity.
Mary Beth has worked with Indigenous author Lisa Charleyboy to develop two books on Native youth and culture. Dreaming in Indian: Contemporary Native American Voices (2014). has won multiple awards including American Indians in Children's Literature Best Book of 2014, 2015 USBBY Outstanding International Books Award, and Center for the Study of Multicultural Literature Book of the Year Award. Also the recipient of many awards, Urban Tribes: Native Americans in the City (2015) received a starred review from School Library Journal, who called it "a refreshingly authentic, edgy, and captivating work." The latest anthology is #NotYourPrincess: Voices of Native American Women (Fall 2017). Mary Beth is also the author of Stormy Seas: Stories of Young Boat Refugees (Spring 2017), which received starred reviews from School Library Journal, Booklist, and Publishers Weekly.
Always happy to take a break from her desk, Mary Beth likes exploring Toronto's wild spaces with her dog Champ and volunteering as an assistant teacher at the Evergreen Brick Works Outdoor Education Program.


text:
Der Yeats-Gletscher ist ein 13 km langer Gletscher in der antarktischen Ross Dependency. Im Königin-Maud-Gebirge fließt er von der Nordseite des Mount Finley in westlicher Richtung zum Shackleton-Gletscher, den er nördlich des westlichen Ausläufers des Lockhart Ridge erreicht.

Der US-amerikanische Geologe Franklin Alton Wade (1903–1978), Leiter der von 1962 bis 1963 und von 1964 bis 1965 durchgeführten Expeditionen der Texas Tech University zum Shackleton-Gletscher, benannte ihn nach Vestal L. Yeats (1919–2017), der an beiden Expeditionen teilgenommen hatte.

Weblinks
  (englisch)
 Yeats Glacier auf geographic.org (englisch)

Gletscher im Transantarktischen Gebirge
Königin-Maud-Gebirge

redpajama_set_name: RedPajamaWikipedia


Another name for the beat in Reggae is 'One Drop'. In this beat, the strong beat is beat three, as opposed to beat one. The first beat is 'dropped'. Hence the term 'One Drop'.
Here's a great example of a One Drop rhythm. Check out the nasty groove created by drummer Carlton "Carly" Barrett and bassist Aston "Family Man" Barrett on Bob Marley's "Trenchtown Rock" from Bob Marley Live!
Bass: The bass is where the action is in reggae. Check out how the the bass line 'drops the one' on every measure except the last one. Amazing Bass, how sweet the sound indeed!
Guitarists: this is two rhythm parts compressed into one for a trio setting. Usually this guitar part would appear as two separate rhythm instrument parts. One instrument playing only the legato strong beat on beat three, the other playing the staccato 'back beat' on beats two and four.
Also, take note of the voice leading in the upper voices of the guitar chords. It really makes the chord progression perk up.


text:
20190115-jain-logo
Staff & Fellows
Maurice Asare
Operations Associate
Maurice Asare joined JFI as an Operations Associate in June of 2019 after graduating from Bowdoin College with a degree in Philosophy and Africana Studies cum laude. He joins JFI with a background in criminal justice, which he has developed through experiences in nonprofit work and research. Maurice interned at the Innocence Project for the Special Counsel for New Initiatives in the summer of 2017. That following summer, he received a grant to conduct research on the tactics used by NYPD officers in communities of color. While at Bowdoin, Maurice focused his academic work on the intersections of gender, race, and the law, writing his senior thesis on the fraught relationship between black women and law enforcement officers. In addition to his work at JFI, Maurice is also a Submissions Reader at Narratively, a digital publication dedicated to focusing on the extraordinary stories of ordinary people.
_default / single.html
Jain Family Institute
© 2019 Jain Family Institute.
568 Broadway, Suite 601
jfi@jainfamilyinstitute.org
Sign up for the JFI Letter, a weekly digest of compelling research across the social sciences.


Get what you need – and preserve your vital relationships with suppliers and colleagues.
You'll be using a method used by top negotiators around the world.
We'll design the training especially for your team - your priorities, your scenarios.
We'll show you a method that gets you what you need - and preserves your vital relationships.
how to use your new communication and negotiation skills to build and improve your relationships with clients, suppliers, family, friends and colleagues.


Naturally affordable solid oak kitchens, hurrah!
Our founders have years of experience in the sourcing of sustainable, competitively-priced solid wood.
Pop in to a showroom near you and see the fab quality on offer for yourself!
In every colour of the Farrow & Ball rainbow - from the comfort of your own home.
deTerra means 'from the earth'.
That's us. That's what we do.
Give us the chance and we will deliver an organic, individual kitchen to you - simple as that.
Our founders have years of experience in the sourcing of sustainable, competitively-priced solid wood. Thanks to their expertise we can supply unique solid oak kitchens in a variety of styles - from traditional-style kitchens to Shaker kitchens - and finishes (sanded, lacquered, or painted in Farrow & Ball colours), all of which are made from 100% solid oak - even the doors! As a final cherry on top of the cake (after all, you deserve only the best!), our kitchens are manufactured and finished within the UK.
deTerra really is a one-stop shop for creating individual, affordable kitchens - all from the comfort of your own home. You can explore our full range of solid oak cabinets and worktops online, as well as oak kitchen doors, kitchen cabinet door handles, sinks & taps, and a plethora of other bits and bobs to give it that finishing touch.
Once you know what you want, it couldn't be easier to fill up your basket. Products are great value. Delivery is super-swift (just 14 days for a whole kitchen) and nationwide (via our dedicated in-house 2Man delivery service, no less). Ordering online is simple, and we are available by phone to assist with any enquiries that you may have. But if you can't quite decide - and with so many glorious products to browse, we would be torn too - you can always pop into one of our showrooms for a closer look. Full demonstration kitchens and a warm welcome await if you are able to visit us - we have showrooms in Gloucestershire, London, Essex, Derbyshire, Cheshire, Surrey, Birmingham and Scotland, with more locations opening in the near future.
In need of inspiration? Check out our Customer Reviews page to hear some honest feedback about the lovely deTerra kitchens our customers are enjoying right now.