text:
namespace Stripe
{
    using System.Collections.Generic;
    using System.Threading;
    using System.Threading.Tasks;

    public class PromotionCodeService : Service<PromotionCode>,
        ICreatable<PromotionCode, PromotionCodeCreateOptions>,
        IListable<PromotionCode, PromotionCodeListOptions>,
        IRetrievable<PromotionCode, PromotionCodeGetOptions>,
        IUpdatable<PromotionCode, PromotionCodeUpdateOptions>
    {
        public PromotionCodeService()
            : base(null)
        {
        }

        public PromotionCodeService(IStripeClient client)
            : base(client)
        {
        }

        public override string BasePath => "/v1/promotion_codes";

        public virtual PromotionCode Create(PromotionCodeCreateOptions options, RequestOptions requestOptions = null)
        {
            return this.CreateEntity(options, requestOptions);
        }

        public virtual Task<PromotionCode> CreateAsync(PromotionCodeCreateOptions options, RequestOptions requestOptions = null, CancellationToken cancellationToken = default)
        {
            return this.CreateEntityAsync(options, requestOptions, cancellationToken);
        }

        public virtual PromotionCode Get(string id, PromotionCodeGetOptions options = null, RequestOptions requestOptions = null)
        {
            return this.GetEntity(id, options, requestOptions);
        }

        public virtual Task<PromotionCode> GetAsync(string id, PromotionCodeGetOptions options = null, RequestOptions requestOptions = null, CancellationToken cancellationToken = default)
        {
            return this.GetEntityAsync(id, options, requestOptions, cancellationToken);
        }

        public virtual StripeList<PromotionCode> List(PromotionCodeListOptions options = null, RequestOptions requestOptions = null)
        {
            return this.ListEntities(options, requestOptions);
        }

        public virtual Task<StripeList<PromotionCode>> ListAsync(PromotionCodeListOptions options = null, RequestOptions requestOptions = null, CancellationToken cancellationToken = default)
        {
            return this.ListEntitiesAsync(options, requestOptions, cancellationToken);
        }

        public virtual IEnumerable<PromotionCode> ListAutoPaging(PromotionCodeListOptions options = null, RequestOptions requestOptions = null)
        {
            return this.ListEntitiesAutoPaging(options, requestOptions);
        }

        public virtual IAsyncEnumerable<PromotionCode> ListAutoPagingAsync(PromotionCodeListOptions options = null, RequestOptions requestOptions = null, CancellationToken cancellationToken = default)
        {
            return this.ListEntitiesAutoPagingAsync(options, requestOptions, cancellationToken);
        }

        public virtual PromotionCode Update(string id, PromotionCodeUpdateOptions options, RequestOptions requestOptions = null)
        {
            return this.UpdateEntity(id, options, requestOptions);
        }

        public virtual Task<PromotionCode> UpdateAsync(string id, PromotionCodeUpdateOptions options, RequestOptions requestOptions = null, CancellationToken cancellationToken = default)
        {
            return this.UpdateEntityAsync(id, options, requestOptions, cancellationToken);
        }
    }
}


text:
module Etem

  VALID_NAME_MSG = "Please use only letters or numbers in name"

  DEF_OPTS = {:temp_path => Dir.tmpdir,
              :model_path => File.join(Rails.root,'lib','etem')
             }.freeze

  TIME_SLICES = %w{WD WN SD SN ID IN}

  def signature
    @opts = DEF_OPTS unless @opts
    @signature ||= YAML.load_file(File.join(@opts[:model_path],'param_sign.yml'))
  end

  def time_proj
    @time_proj ||= YAML.load_file(File.join(@opts[:model_path],'param_proj_period.yml'))
  end

  def fraction
    unless @fraction
      @fraction = {}
      Parameter.find_by_name('fraction').parameter_values.each do |row|
        @fraction[row.time_slice] = row.value
      end
    end
    @fraction
  end

  def inherit_ts
    @inherit_ts ||= YAML.load_file(File.join(@opts[:model_path],'param_inherit_ts.yml'))
  end

  # projection of the couples (year,value) in the time periods of ETEM (1..nb_periods)
  def projection(hash,type=nil)
    proj = Hash.new
    # Si l'année `0` est défini, on répète la valeur
    if hash[0]
      periods.each{|year|proj[period(year)]=hash[0]}
    else
      # Projection des valeurs toute les années
      val = hash[hash.keys.min]
      v = (first_year...(first_year+nb_periods*period_duration)).collect{|y|
        if hash[y]
          val = hash[y]
        else
          val
        end
      }
      # Calcul pour les seules périodes renseignées
      p_k = hash.keys.collect{|x|period(x)}.uniq.sort
      p_k.each{|p|
        proj[p] = v[(p-1)*period_duration]
        #proj[p] = v[(p-1)*period_duration,period_duration].sum / period_duration
      }
      # Interpolation
      if type == "interpolation" || type == "extrapolation"
        (p_k.first..p_k.last).inject(-1) { |cur,p|
          if proj[p]
            cur += 1 # slide cursor position
          else
            proj[p] = interpolate(p_k[cur],p_k[cur+1],proj[p_k[cur]],proj[p_k[cur+1]],p)
            cur      # return cursor position
          end
        }
      end
      # Extrapolation
      if type == "extrapolation"
        (1..p_k.first-1).each{|x|proj[x]=proj[p_k.first]} unless p_k.first == 1
        (p_k.last+1..nb_periods).each{|x|proj[x]=proj[p_k.last]} unless p_k.last == nb_periods
      end
    end
    proj
  end

  def interpolate(x1,x2,y1,y2,x)
    (x.to_f-x1) / (x2-x1) * (y2-y1) + y1
  end

  def next_available_name(klass,name)
    counter = 0
    available_name=name
    while klass.find_by_name(available_name)
      available_name=name + "-#{counter+=1}"
    end
    available_name
  end

end

redpajama_set_name: RedPajamaGithub


text:
package web

import (
	d "github.com/jeffjen/docker-monitor/upkeep/driver"

	"errors"
	"fmt"
	ctx "golang.org/x/net/context"
	http "golang.org/x/net/context/ctxhttp"
	"io"
	"io/ioutil"
	"net/url"
)

var (
	ErrNotReachable = errors.New("web not reachable")
)

type HttpProbe struct {
	url string
}

func (h *HttpProbe) Probe(c ctx.Context) error {
	resp, err := http.Get(c, nil, h.url)
	if err != nil {
		return ErrNotReachable
	} else {
		go func() {
			defer resp.Body.Close()
			io.Copy(ioutil.Discard, resp.Body)
		}()
		if resp.StatusCode != 200 {
			return fmt.Errorf("%d: %s", resp.StatusCode, h.url)
		} else {
			return nil
		}
	}
}

func (h *HttpProbe) Close() error {
	return nil
}

func New(endpoint string) (d.Driver, error) {
	u, _ := url.Parse(endpoint)
	u.Scheme = "http"
	return &HttpProbe{u.String()}, nil
}


text:
'use strict';

var other_actions = require('./sample');

var server_actions = {
    samplePageWithQuery: function (req) {
        // Dark magic, set query direct to store
        // this.dispatch() is correct way to do this
        this.getStore('page')._set('query', req.query);
        return this.executeAction(server_actions.samplePage);
    },
    samplePage: function () {
        return this.executeAction(other_actions.updateStoreByApi).then(function () {
            return this.dispatch('UPDATE_TITLE', this.getStore('productStore')._get('data').title);
        }.bind(this));
    }
};

module.exports = server_actions;


text:
const Wizard_en: any = {
  basic_settings: 'Basic Settings',

  public_settings: 'Data that is seen on Public / Hidden events',

  email_administration_link_help: 'You will receive a message to this EMAil address containing a secret link to the administration area. ' +
      'This EMail address will also later on be used when sending messages to your participants. ' +
      'This message will contain also another link which you will need to open to confirm that you are really the creator of this event.',
  administration_link_help: 'Please note down this link or save it to your favorites. Important: This link should NOT be shared with any other people due to it provides acccess to the administration area. ' +
      'Check your mailbox: You should have received an EMail containing this link and containing also another link, which you need to confirm the creation of this event ' +
      '(only after confirming by using this link, the messaging functionality will be unlocked).',
  administration_link_open: 'Open Administration',

  error_required_meal_label: 'Each meal must have a name.',
  error_required_meal_time: 'You must setup the time for each meal.',
  error_invalid_meal_time: 'The time for each meal must be on same day as the event.',
  error_invalid_meal_size: 'Currently we support only events with 2 or 3 meals.',

  team_distribution_help: 'Automatically try to build teams so that a team consists of one participant that cannot host and one participant that can host (due the number of seats is sufficient).',

  team_size: 'Team size',

  team_distribution_force_equl_hosting: 'Try to mix teams to equal hosting capabillities',

  gender_aspects: 'Gender distribution',
  gender_aspects_help: 'Gender of participants must be specified for this option to work.',

  meals_help: 'You can change the name of the meals and/or add new ones or remove existing ones. You need however at least 2 meals.',

  time_setup: 'Setup meal times',

  participants_preview: 'Participant preview',
  participants_preview_text: 'With the current settings, you need at least {{ numParticipants }} participants for being able to run your dinner event.',
  participants_preview_demo_text: 'The system will automatically create 18 demo participants for your demo event, so that you can easily start to test ' +
      'all functionalities in no time. You can create of course also your own participants for test purposes.',

  almost_there: 'Almost there...',

  administration_email_label: 'Your EMail address',

  adv_headline: 'Data Processing Aggreement',
  adv_text_question: 'Why should I care?',
  adv_text_answer: 'Starting with 25th May 2018, the European Union has added a new law for processing personal data, the so called "Datenschutz-Grundverordnung" (DSGVO)',
  adv_text_help: 'As an event organizer you are responsible for the personal data of your participants in terms of data protection. Due to we cannot ensure that you ' +
      'process the data only for personal and/or family-related purposes, ' +
      'you need to aggree to the <anchor href="/resources/AV-Vereinbarung.pdf" title="Data Processing Terms (DE)" />, which provides the legal protection ' +
      'for you as the event organizer and us as the service provider.',
  adv_text_address_help: 'In order to be compliant with the Data Processing Terms, you have to enter your address data.
\n' +
      'Important: We will never make your data public and we will use it only for running our service.',

  finish: 'Finish!',
  done: '... Done!',
  administration_link: 'Administration link',

  wizard_step_basics: 'Basics',
  wizard_step_options: 'Details',
  wizard_step_mealtimes: 'Schedule',
  wizard_step_public_registration: 'Public Registration',
  wizard_step_participant_preview: 'Participants Preview',
  wizard_step_finish: 'Finish',

  wizard_demo_mode_text: 'Demo mode: All settings are preassigned, but you can change them.' +
      '
Note: Public dinner events will not be published in demo mode.',

  wizard_create_title: 'Create new Running Dinner Event!'
};
export default Wizard_en;


text:
<idea-plugin>
  <module value="com.intellij.modules.remoteServers"/>

  <extensionPoints>
    <extensionPoint name="remoteServer.type" interface="com.intellij.remoteServer.ServerType"/>
    <extensionPoint name="remoteServer.deploymentSource.type" interface="com.intellij.remoteServer.configuration.deployment.DeploymentSourceType"/>
    <extensionPoint name="remoteServer.viewContributor" interface="com.intellij.remoteServer.impl.runtime.ui.RemoteServersViewContributor"/>

    <extensionPoint name="remoteServer.util.CloudDeploymentRuntimeProvider"
                    interface="com.intellij.remoteServer.util.CloudDeploymentRuntimeProvider"/>
    <extensionPoint name="remoteServer.runConfigurationExtension"
                    interface="com.intellij.remoteServer.impl.configuration.deployment.DeployToServerRunConfigurationExtension"/>
  </extensionPoints>

  <extensions defaultExtensionNs="com.intellij">
    <applicationService serviceInterface="com.intellij.remoteServer.configuration.RemoteServersManager"
                        serviceImplementation="com.intellij.remoteServer.impl.configuration.RemoteServersManagerImpl"/>
    <applicationService serviceInterface="com.intellij.remoteServer.runtime.ServerConnectionManager"
                        serviceImplementation="com.intellij.remoteServer.impl.runtime.ServerConnectionManagerImpl"/>
    <applicationService serviceInterface="com.intellij.remoteServer.agent.RemoteAgentManager"
                        serviceImplementation="com.intellij.remoteServer.agent.impl.RemoteAgentManagerImpl"/>
    <applicationService serviceInterface="com.intellij.remoteServer.runtime.clientLibrary.ClientLibraryManager"
                        serviceImplementation="com.intellij.remoteServer.impl.runtime.clientLibrary.ClientLibraryManagerImpl"/>
    <applicationService serviceInterface="com.intellij.remoteServer.impl.configuration.deployment.DeployToServerRunConfigurationExtensionsManager"
                        serviceImplementation="com.intellij.remoteServer.impl.configuration.deployment.DeployToServerRunConfigurationExtensionsManager"/>
    <applicationConfigurable groupId="build"
                             id="RemoteServers"
                             provider="com.intellij.remoteServer.impl.configuration.RemoteServerListConfigurableProvider"/>
    <search.optionContributor implementation="com.intellij.remoteServer.impl.configuration.RemoteServerSearchableOptionContributor"/>
    <programRunner implementation="com.intellij.remoteServer.impl.runtime.DeployToServerRunner"/>
    <projectService serviceInterface="com.intellij.remoteServer.runtime.ui.RemoteServersView"
                    serviceImplementation="com.intellij.remoteServer.impl.runtime.ui.RemoteServersViewImpl"/>
    <projectService serviceInterface="com.intellij.remoteServer.configuration.deployment.DeploymentConfigurationManager"
                    serviceImplementation="com.intellij.remoteServer.impl.configuration.deployment.DeploymentConfigurationManagerImpl"/>
    <remoteServer.deploymentSource.type implementation="com.intellij.remoteServer.impl.configuration.deployment.ModuleDeploymentSourceType"/>
    <applicationService serviceInterface="com.intellij.remoteServer.impl.runtime.log.CloudTerminalProvider"
                        serviceImplementation="com.intellij.remoteServer.impl.runtime.log.ConsoleTerminalProvider"/>
    <toolWindow id="Application Servers" anchor="bottom" icon="RemoteServersIcons.ServersToolWindow"
                factoryClass="com.intellij.remoteServer.impl.runtime.ui.DefaultServersToolWindowFactory"
                conditionClass="com.intellij.remoteServer.impl.runtime.ui.DefaultServersToolWindowFactory"/>
    <applicationInitializedListener implementation="com.intellij.remoteServer.impl.configuration.deployment.DeployToServerConfigurationTypesRegistrar"/>
  </extensions>
  <project-components>
    <component>
      <implementation-class>com.intellij.remoteServer.impl.runtime.ui.DefaultServersToolWindowManager</implementation-class>
      <headless-implementation-class/>
    </component>
  </project-components>

  <actions>
    <group id="RemoteServersViewToolbar" text="Remote Servers">
      <action id="RemoteServers.ConnectServer" class="com.intellij.remoteServer.impl.runtime.ui.tree.actions.RemoteServerConnectAction"
              text="Connect" description="Connect to the selected remote server" icon="AllIcons.Actions.Execute"/>
      <action id="RemoteServers.DisconnectServer" class="com.intellij.remoteServer.impl.runtime.ui.tree.actions.RemoteServerDisconnectAction"
              text="Disconnect" description="Disconnect from the selected remote server" icon="AllIcons.Actions.Suspend"/>
      <action id="RemoteServers.EditServerConfig" class="com.intellij.remoteServer.impl.runtime.ui.tree.actions.RemoteServerConfigAction"
              text="Edit Configuration" description="Edit the selected remote server configuration" icon="AllIcons.Actions.EditSource"/>
      <action id="RemoteServers.ChooseServerDeployment" class="com.intellij.remoteServer.impl.runtime.ui.tree.actions.ChooseDeploymentAction"
              text="Deploy" description="Deploy a chosen item to the selected remote server" icon="AllIcons.Nodes.Deploy"/>
      <action id="RemoteServers.ChooseServerDeploymentWithDebug" class="com.intellij.remoteServer.impl.runtime.ui.tree.actions.ChooseDeploymentWithDebugAction"
              text="Debug" description="Deploy and debug a chosen item on the selected remote server" icon="AllIcons.Actions.StartDebugger"/>

      <action id="Servers.Deploy" class="com.intellij.remoteServer.impl.runtime.ui.tree.actions.DeployAction"
              text="Deploy" description="Deploy the selected item" icon="AllIcons.Nodes.Deploy"/>
      <action id="Servers.Undeploy" class="com.intellij.remoteServer.impl.runtime.ui.tree.actions.UndeployAction"
              text="Undeploy" description="Undeploy the selected item" icon="AllIcons.Nodes.Undeploy"/>
      <action id="Servers.DeployWithDebug" class="com.intellij.remoteServer.impl.runtime.ui.tree.actions.DeployWithDebugAction"
              text="Debug" description="Deploy and debug the selected item" icon="AllIcons.Actions.StartDebugger"/>
      <action id="RemoteServers.EditDeploymentConfig" class="com.intellij.remoteServer.impl.runtime.ui.tree.actions.DeploymentConfigAction"
              text="Edit Configuration" description="Edit the selected deployment run configuration" icon="AllIcons.Actions.EditSource"/>

      <add-to-group group-id="Other.KeymapGroup"/>
    </group>
    <group id="RemoteServersViewPopup"/>
    <group id="RemoteServersViewToolbar.Top">
      <add-to-group group-id="Other.KeymapGroup"/>
    </group>
  </actions>
</idea-plugin>


text:
using System.ComponentModel;

namespace Umbraco.Cms.Core.Configuration.Models;

/// <summary>
///     Typed configuration options for image cache settings.
/// </summary>
public class ImagingCacheSettings
{
    internal const string StaticBrowserMaxAge = "7.00:00:00";
    internal const string StaticCacheMaxAge = "365.00:00:00";
    internal const int StaticCacheHashLength = 12;
    internal const int StaticCacheFolderDepth = 8;
    internal const string StaticCacheFolder = Constants.SystemDirectories.TempData + "/MediaCache";

    /// <summary>
    ///     Gets or sets a value for the browser image cache maximum age.
    /// </summary>
    [DefaultValue(StaticBrowserMaxAge)]
    public TimeSpan BrowserMaxAge { get; set; } = TimeSpan.Parse(StaticBrowserMaxAge);

    /// <summary>
    ///     Gets or sets a value for the image cache maximum age.
    /// </summary>
    [DefaultValue(StaticCacheMaxAge)]
    public TimeSpan CacheMaxAge { get; set; } = TimeSpan.Parse(StaticCacheMaxAge);

    /// <summary>
    ///     Gets or sets a value for the image cache hash length.
    /// </summary>
    [DefaultValue(StaticCacheHashLength)]
    public uint CacheHashLength { get; set; } = StaticCacheHashLength;

    /// <summary>
    ///     Gets or sets a value for the image cache folder depth.
    /// </summary>
    [DefaultValue(StaticCacheFolderDepth)]
    public uint CacheFolderDepth { get; set; } = StaticCacheFolderDepth;

    /// <summary>
    ///     Gets or sets a value for the image cache folder.
    /// </summary>
    [DefaultValue(StaticCacheFolder)]
    public string CacheFolder { get; set; } = StaticCacheFolder;
}


text:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

  <modelVersion>4.0.0</modelVersion>

  <groupId>org.easyb</groupId>
  <artifactId>site-examples-test</artifactId>
  <version>testing</version>
  <description>Tests the examples from the easyb site</description>

  <build>
    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
          <source>1.5</source>
          <target>1.5</target>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.easyb</groupId>
        <artifactId>maven-easyb-plugin</artifactId>
       <version>@project.version@</version>
        <executions>
          <execution>
            <goals>
              <goal>test</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

</project>


text:
package org.jrdf.query;

import java.net.URI;

import junit.framework.TestCase;
import org.jrdf.graph.Graph;
import org.jrdf.query.DefaultQueryExecutor;
import org.jrdf.connection.MockBadGraph;
import org.jrdf.connection.JrdfConnectionFactory;

/**
 * Unit test for {@link DefaultQueryExecutor}.
 *
 * @author Tom Adams
 * @version $Revision: 1.1 $
 */
public class DefaultQueryExecutorUnitTest extends TestCase {

  private static final Graph BAD_GRAPH = new MockBadGraph();
  private static final URI NO_SECURITY_DOMAIN = JrdfConnectionFactory.NO_SECURITY_DOMAIN;

  public void testNullQueryThrowsException() throws Exception {
    try {
      new DefaultQueryExecutor(BAD_GRAPH, NO_SECURITY_DOMAIN).executeQuery(null);
      fail("Null query should have thrown IllegalArgumentException");
    } catch (IllegalArgumentException expected) { }
  }

//  public void testQueryExceptionWrapped() throws InvalidQuerySyntaxException {
//    try {
//      new DefaultQueryExecutor(BAD_GRAPH, NO_SECURITY_DOMAIN).executeQuery(buildQuery());
//      fail("QueryException should jave been wrapped as JrdfConnectionException");
//    } catch (JrdfConnectionException expected) { }
//  }

  public void testNullSessionInConstructor() {
    try {
      new DefaultQueryExecutor(null, NO_SECURITY_DOMAIN);
      fail("Null session should have thrown IllegalArgumentException");
    } catch (IllegalArgumentException expected) {
    }
  }

  public void testNullSesurityDomainInConstructor() {
    try {
      new DefaultQueryExecutor(BAD_GRAPH, null);
      fail("Null security domain should have thrown IllegalArgumentException");
    } catch (IllegalArgumentException expected) {
    }
  }
}


text:
package org.mustangproject.ZUGFeRD;

import junit.framework.TestCase;

import java.math.BigDecimal;

public abstract class MustangReaderTestCase extends TestCase implements IExportableTransaction {

	public MustangReaderTestCase(String testName) {
		super(testName);
	}

	@Override
	public IZUGFeRDTradeSettlement[] getTradeSettlement() {
		Payment[] payments = new Payment[1];
		payments[0] = new Payment();
		return payments;
	}

	protected class Payment implements IZUGFeRDTradeSettlementPayment {

		@Override
		public String getOwnBIC() {
			return "COBADEFFXXX";
		}

		@Override
		public String getOwnPaymentInfoText() {
			return "Überweisung";
		}

		@Override
		public String getOwnIBAN() {
			return "DE88 2008 0000 0970 3757 00";
		}
	}

	protected class RecipientTradeParty implements IZUGFeRDExportableTradeParty {

		@Override
		public String getCountry() {
			return "DE";
		}

		@Override
		public String getLocation() {
			return "Spielkreis";
		}

		@Override
		public String getName() {
			return "Theodor Est";
		}

		@Override
		public String getStreet() {
			return "Bahnstr. 42";
		}

		@Override
		public String getAdditionalAddress() {
			return "Hinterhaus";
		}

		@Override
		public String getAdditionalAddressExtension() {
			return "Zweiter Stock";
		}

		@Override
		public String getVATID() {
			return "DE999999999";
		}

		@Override
		public String getZIP() {
			return "88802";
		}
	}

	protected class SenderContact implements IZUGFeRDExportableContact {

		@Override
		public String getName() {
			return "Ingmar N. Fo";
		}

		@Override
		public String getPhone() {
			return "++49(0)237823";
		}

		@Override
		public String getEMail() {
			return "info@localhost.local";
		}

	}

	protected class SenderTradeParty implements IZUGFeRDExportableTradeParty {

		@Override
		public String getName() {
			return "Bei Spiel GmbH";
		}

		@Override
		public String getZIP() {
			return "12345";
		}

		@Override
		public String getCountry() {
			return "DE";
		}

		@Override
		public String getLocation() {
			return "Stadthausen";
		}

		@Override
		public String getStreet() {
			return "Ecke 12";
		}

		@Override
		public String getTaxID() {
			return "0815";
		}

		@Override
		public String getVATID() {
			return "DE0815";
		}

	}

	protected class Item implements IZUGFeRDExportableItem {

		public Item(BigDecimal price, BigDecimal quantity, IZUGFeRDExportableProduct product) {
			super();
			this.price = price;
			this.quantity = quantity;
			this.product = product;
		}

		private BigDecimal price, quantity;
		private IZUGFeRDExportableProduct product;
		private String addReference=null;

		public String getAdditionalReferencedDocumentID() {
			return addReference;
		}

		@Override
		public BigDecimal getPrice() {
			return price;
		}

		public void setPrice(BigDecimal price) {
			this.price = price;
		}

		@Override
		public BigDecimal getQuantity() {
			return quantity;
		}

		public void setQuantity(BigDecimal quantity) {
			this.quantity = quantity;
		}

		@Override
		public IZUGFeRDExportableProduct getProduct() {
			return product;
		}

		public void setProduct(IZUGFeRDExportableProduct product) {
			this.product = product;
		}

		@Override
		public IZUGFeRDAllowanceCharge[] getItemAllowances() {
			return null;
		}

		@Override
		public IZUGFeRDAllowanceCharge[] getItemCharges() {
			return null;
		}

		public String getAddReference() {
			return addReference;
		}

		public void setAddReference(String addReference) {
			this.addReference = addReference;
		}

	}

	protected class Product implements IZUGFeRDExportableProduct {
		private String description, name, unit;
		private BigDecimal VATPercent;

		public Product(String description, String name, String unit, BigDecimal VATPercent) {
			super();
			this.description = description;
			this.name = name;
			this.unit = unit;
			this.VATPercent = VATPercent;
		}

		@Override
		public String getDescription() {
			return description;
		}

		public void setDescription(String description) {
			this.description = description;
		}

		@Override
		public String getName() {
			return name;
		}

		public void setName(String name) {
			this.name = name;
		}

		@Override
		public String getUnit() {
			return unit;
		}

		public void setUnit(String unit) {
			this.unit = unit;
		}

		@Override
		public BigDecimal getVATPercent() {
			return VATPercent;
		}

		public void setVATPercent(BigDecimal VATPercent) {
			this.VATPercent = VATPercent;
		}
	}

}


text:
<?php

use PayPal\Common\PPUserAgent;

class UserAgentTest extends PHPUnit_Framework_TestCase
{

    public function testGetValue()
    {
        $ua = PPUserAgent::getValue("name", "version");
        list($id, $version, $features) = sscanf($ua, "PayPalSDK/%s %s (%s)");

        // Check that we pass the useragent in the expected format
        $this->assertNotNull($id);
        $this->assertNotNull($version);
        $this->assertNotNull($features);

        $this->assertEquals("name", $id);
        $this->assertEquals("version", $version);

        // Check that we pass in these mininal features
        $this->assertThat($features, $this->stringContains("OS="));
        $this->assertThat($features, $this->stringContains("Bit="));
        $this->assertThat($features, $this->stringContains("Lang="));
        $this->assertThat($features, $this->stringContains("V="));
        $this->assertGreaterThan(5, count(explode(';', $features)));
    }
}


text:
> Where you try to avoid the drudgery of the whole textbook process.

---

![](http://images.ecampus.com/images/new-ecampus/ecampus-rent-buy-sell-textbooks-logo.png)

[eCampus at Hampton University](http://www.ecampus.com/hamptonu) will tell you which textbooks your teacher will be using ahead of time so you can order them prior to class starting.

---

# However

it is highly recommended you don't actually get the physical copy of any of your textbooks for class unless you know for certain you will be needing it for class or it's mandatory (mainly for classes that have a laboratory section).

> Some professors will only use their textbooks for one assignment the entire semester and then completely disregard it.

> Others will reference the textbook constantly for homework assignments. This is when you'll actually want to go ahead and purchase the textbook.

# So,

- first try and find a PDF version of the textbook using Google (*and yes, it's possible that you once bought a textbook that was available for free online*)

> make the search faster by inserting  `filetype:pdf` into the search query

- if you find the pdf, save it and then transfer it to your iPhone through iBooks or simply your tablet

- if you can't find it online anywhere, then simply rent the virtual version of the textbook for a semester

- you can go to [BookFinder](http://www.bookfinder.com/textbooks/) or [BookFinder4U](http://www.bookfinder4u.com/cheap_textbooks.html) and compare the prices to find the cheapest price for the textbook you are trying to find

- once you no longer need your textbook, find the highest price you can sell it at on [BookScouter](http://www.bookscouter.com/), where they sell your books for the most money.

---

![](http://www.socialhacks.com/wp-content/uploads/2012/01/Buying-Cheap-Textbooks1.jpg)

## Renting Cheap Textbooks

### [BIGWORDS](http://www.bigwords.com/)

> Finds the sweetest, cheapest textbooks, saves $1,000 annually on average.
35-45% cheaper textbooks than other online stores, and up to 90% cheaper than the bookstore.

### [Cheapest Textbooks](http://www.cheapesttextbooks.com/)

> This free service scours the internet to help you find the cheapest place to buy used textbooks, new textbooks, rental textbooks, and so on.

### [Occupy the Bookstore | Chrome Extension](https://chrome.google.com/webstore/detail/occupy-the-bookstore/ipheiokfflghncbmedblogighkbongmo?hl=en-US)

> A price comparison extension to help students find the best textbook deals when they search for their course books.


text:
#include "settingpage.h"
#include "yubikeyfinder.h"
#include "yubikeyutil.h"
#include "yubikeywriter.h"
#include "yubikeylogger.h"
#include "ui_settingpage.h"
#include "ui/helpbox.h"
#include "toolpage.h"

#include <QFile>
#include <QMessageBox>
#include <QDebug>
#include <QSettings>
#include <QSignalMapper>
#include <QRegExpValidator>

#include "common.h"

#define DECIMAL 0
#define MODHEX 1
#define HEX 2

#define OUT_CHAR_RATE_STD 0
#define OUT_CHAR_RATE_SLOWDOWN_20 1
#define OUT_CHAR_RATE_SLOWDOWN_40 2
#define OUT_CHAR_RATE_SLOWDOWN_60 3

SettingPage::SettingPage(QWidget *parent) :
        QStackedWidget(parent),
        ui(new Ui::SettingPage)
{
    QSignalMapper *mapper = new QSignalMapper(this);
    ui->setupUi(this);

    m_ykConfig = NULL;

    //Connect help buttons
    connectHelpButtons();

    connect(ui->updateBtn, SIGNAL(clicked()), mapper, SLOT(map()));
    connect(ui->updateBackBtn, SIGNAL(clicked()), mapper, SLOT(map()));
    mapper->setMapping(ui->updateBtn, Page_Update);
    mapper->setMapping(ui->updateBackBtn, Page_Base);
    connect(mapper, SIGNAL(mapped(int)), this, SLOT(setCurrentPage(int)));
    m_currentPage = 0;
    setCurrentIndex(Page_Base);

    //Connect other signals and slots
    connect(ui->restoreBtn, SIGNAL(clicked()),
            this, SLOT(restore()));

    // autosave when changing settings
    connect(ui->custPrefixCheck, SIGNAL(clicked()), this, SLOT(save()));
    connect(ui->logOutputCheck, SIGNAL(clicked()), this, SLOT(save()));
    connect(ui->tabFirstBtn, SIGNAL(clicked()), this, SLOT(save()));
    connect(ui->appendTab1Btn, SIGNAL(clicked()), this, SLOT(save()));
    connect(ui->appendTab2Btn, SIGNAL(clicked()), this, SLOT(save()));
    connect(ui->appendCRBtn, SIGNAL(clicked()), this, SLOT(save()));
    connect(ui->appendDelay1Check, SIGNAL(clicked()), this, SLOT(save()));
    connect(ui->appendDelay2Check, SIGNAL(clicked()), this, SLOT(save()));
    connect(ui->srBtnVisibleCheck, SIGNAL(clicked()), this, SLOT(save()));
    connect(ui->srUsbVisibleCheck, SIGNAL(clicked()), this, SLOT(save()));
    connect(ui->srApiVisibleCheck, SIGNAL(clicked()), this, SLOT(save()));
    connect(ui->manUpdateCheck, SIGNAL(clicked()), this, SLOT(save()));
    connect(ui->updateCheck, SIGNAL(clicked()), this, SLOT(save()));
    connect(ui->fastTrigCheck, SIGNAL(clicked()), this, SLOT(save()));
    connect(ui->ledInvertCheck, SIGNAL(clicked()), this, SLOT(save()));
    connect(ui->useNumericKeypadCheck, SIGNAL(clicked()), this, SLOT(save()));
    connect(ui->logFormatCombo, SIGNAL(activated(int)), this, SLOT(save()));
    connect(ui->logFormatEdit, SIGNAL(textEdited(QString)), this, SLOT(save()));
    connect(ui->outCharRateCombo, SIGNAL(activated(int)), this, SLOT(save()));
    connect(ui->exportCheck, SIGNAL(clicked()), this, SLOT(save()));

    connect(YubiKeyFinder::getInstance(), SIGNAL(keyFound(bool, bool*, int)),
            this, SLOT(keyFound(bool, bool*)));

    QRegExp modHexRx("^[cbdefghijklnrtuv]{0,4}$");
    ui->custPrefixModhexTxt->setValidator(new QRegExpValidator(modHexRx, this));
    QRegExp decRx("^[0-9]{0,5}$");
    ui->custPrefixDecTxt->setValidator(new QRegExpValidator(decRx, this));
    QRegExp hexRx("^[0-9a-f]{0,4}$");
    ui->custPrefixHexTxt->setValidator(new QRegExpValidator(hexRx, this));
}

SettingPage::~SettingPage() {
    delete ui->custPrefixModhexTxt->validator();
    if(m_ykConfig != NULL) {
        delete m_ykConfig;
    }
    delete ui;
}

void SettingPage::connectHelpButtons() {
    //Map the values of the help buttons

    //Create a QMapper
    QSignalMapper *mapper = new QSignalMapper(this);

    //Connect the clicked signal with the QSignalMapper
    connect(ui->outFormatHelpBtn, SIGNAL(clicked()), mapper, SLOT(map()));
    connect(ui->outSpeedHelpBtn, SIGNAL(clicked()), mapper, SLOT(map()));
    connect(ui->srVisibilityHelpBtn, SIGNAL(clicked()), mapper, SLOT(map()));
    connect(ui->updateHelpBtn, SIGNAL(clicked()), mapper, SLOT(map()));
    connect(ui->swapHelpBtn, SIGNAL(clicked()), mapper, SLOT(map()));
    connect(ui->manUpdateHelpBtn, SIGNAL(clicked()), mapper, SLOT(map()));
    connect(ui->logFormatEditHelpBtn, SIGNAL(clicked()), mapper, SLOT(map()));

    //Set a value for each button
    mapper->setMapping(ui->outFormatHelpBtn, HelpBox::Help_OutputFormat);
    mapper->setMapping(ui->outSpeedHelpBtn, HelpBox::Help_OutputSpeed);
    mapper->setMapping(ui->srVisibilityHelpBtn, HelpBox::Help_SrNoVisibility);
    mapper->setMapping(ui->updateHelpBtn, HelpBox::Help_AllowUpdate);
    mapper->setMapping(ui->swapHelpBtn, HelpBox::Help_Swap);
    mapper->setMapping(ui->manUpdateHelpBtn, HelpBox::Help_ManUpdate);
    mapper->setMapping(ui->logFormatEditHelpBtn, HelpBox::Help_LogFormat);

    //Connect the mapper
    connect(mapper, SIGNAL(mapped(int)), this, SIGNAL(showHelp(int)));
    connect(ui->configProtectionBox, SIGNAL(showHelp(int)), this, SIGNAL(showHelp(int)));
}

void SettingPage::setCurrentPage(int pageIndex) {
    m_currentPage = pageIndex;
    setCurrentIndex(pageIndex);
}

void SettingPage::init() {
    load();
}

void SettingPage::restoreDefaults() {
    QSettings settings;

    settings.setValue(SG_CUSTOMER_PREFIX_USED,  false);
    settings.setValue(SG_CUSTOMER_PREFIX,       0);

    settings.setValue(SG_LOG_DISABLED,          false);
    // we continue loading LOG_FILENAME since we use that to check if settings are loaded
    settings.setValue(SG_LOG_FILENAME,          YubiKeyLogger::defaultLogFilename());
    settings.setValue(SG_LOG_FORMAT,            YubiKeyLogger::Format_Traditional);

    settings.setValue(SG_EXPORT_FILENAME,       YubiKeyWriter::defaultExportFilename());
    settings.setValue(SG_IMPORT_FILENAME,       ToolPage::defaultImportFilename());

    settings.setValue(SG_TAB_FIRST,             false);
    settings.setValue(SG_APPEND_TAB1,           false);
    settings.setValue(SG_APPEND_TAB2,           false);
    settings.setValue(SG_APPEND_CR,             true);
    settings.setValue(SG_APPEND_DELAY1,         false);
    settings.setValue(SG_APPEND_DELAY2,         false);
    settings.setValue(SG_PACING_10MS,           false);
    settings.setValue(SG_PACING_20MS,           false);

    settings.setValue(SG_SR_BTN_VISIBLE,        true);
    settings.setValue(SG_SR_USB_VISIBLE,        false);
    settings.setValue(SG_SR_API_VISIBLE,        true);

    settings.setValue(SG_MAN_UPDATE,            false);

    settings.setValue(SG_ALLOW_UPDATE,          true);
    settings.setValue(SG_FAST_TRIG,             false);
    settings.setValue(SG_USE_NUMERIC_KEYPAD,    false);

    settings.setValue(SG_OATH_HOTP8,            false);
    settings.setValue(SG_REQUIRE_INPUT,         false);
    settings.setValue(SG_HMAC_LT64,             true);

    settings.setValue(SG_STRONG_PW1,            false);
    settings.setValue(SG_STRONG_PW2,            false);
    settings.setValue(SG_STRONG_PW3,            false);

    settings.setValue(SG_EXPORT_PREFERENCE,     false);
}

void SettingPage::load() {
    QSettings settings;

    QString logFilename = settings.value(SG_LOG_FILENAME).toString();
    bool logDisabled = settings.value(SG_LOG_DISABLED).toBool();
    int logFormat = settings.value(SG_LOG_FORMAT).toInt();
    if(logFilename.isEmpty()) {
        //This is the first time... set defaults
        restoreDefaults();
    }

    YubiKeyLogger::setLogFilename(logFilename);

    QString exportFilename = settings.value(SG_EXPORT_FILENAME).toString();
    if(!exportFilename.isEmpty()) {
        YubiKeyWriter::setExportFilename(exportFilename);
    }

    QString importFilename = settings.value(SG_IMPORT_FILENAME).toString();
    if(!importFilename.isEmpty()) {
        ToolPage::setImportFilename(importFilename);
    }

    //General settings...
    //Customer prefix
    bool custPrefixUsed = settings.value(SG_CUSTOMER_PREFIX_USED).toBool();
    if(custPrefixUsed) {
        ui->custPrefixCheck->setChecked(true);

        int custPrefix = settings.value(SG_CUSTOMER_PREFIX).toInt();
        if(custPrefix > 0) {
            custPrefixChanged(DECIMAL, QString::number(custPrefix));
            ui->custPrefixDecTxt->setEnabled(true);
            ui->custPrefixModhexTxt->setEnabled(true);
            ui->custPrefixHexTxt->setEnabled(true);
        }
    } else {
        ui->custPrefixCheck->setChecked(false);

        ui->custPrefixDecTxt->clear();
        ui->custPrefixDecTxt->setEnabled(false);
        ui->custPrefixModhexTxt->clear();
        ui->custPrefixModhexTxt->setEnabled(false);
        ui->custPrefixHexTxt->clear();
        ui->custPrefixHexTxt->setEnabled(false);
    }

    // OTP output settings...
    ui->tabFirstBtn->setChecked(settings.value(SG_TAB_FIRST).toBool());
    ui->appendTab1Btn->setChecked(settings.value(SG_APPEND_TAB1).toBool());
    ui->appendTab2Btn->setChecked(settings.value(SG_APPEND_TAB2).toBool());
    ui->appendCRBtn->setChecked(settings.value(SG_APPEND_CR).toBool());

    ui->appendDelay1Check->setChecked(settings.value(SG_APPEND_DELAY1).toBool());
    ui->appendDelay2Check->setChecked(settings.value(SG_APPEND_DELAY2).toBool());

    bool pacing10ms = settings.value(SG_PACING_10MS).toBool();
    bool pacing20ms = settings.value(SG_PACING_20MS).toBool();
    int outCharRateIndex = 0;
    if(pacing10ms) {
        if(pacing20ms) {
            outCharRateIndex = OUT_CHAR_RATE_SLOWDOWN_60;
        } else {
            outCharRateIndex = OUT_CHAR_RATE_SLOWDOWN_20;
        }
    } else if(pacing20ms) {
        outCharRateIndex =  OUT_CHAR_RATE_SLOWDOWN_40;
    }
    ui->outCharRateCombo->setCurrentIndex(outCharRateIndex);

    //Serial # visibility settings...
    ui->srBtnVisibleCheck->setChecked(settings.value(SG_SR_BTN_VISIBLE).toBool());
    ui->srUsbVisibleCheck->setChecked(settings.value(SG_SR_USB_VISIBLE).toBool());
    ui->srApiVisibleCheck->setChecked(settings.value(SG_SR_API_VISIBLE).toBool());

    //Static Password settings...
    ui->manUpdateCheck->setChecked(settings.value(SG_MAN_UPDATE).toBool());

    //Updatable settings...
    if(settings.contains(SG_ALLOW_UPDATE)) {
        ui->updateCheck->setChecked(settings.value(SG_ALLOW_UPDATE).toBool());
    } else {
        ui->updateCheck->setChecked(true);
    }

    // extended settings..
    ui->fastTrigCheck->setChecked(settings.value(SG_FAST_TRIG).toBool());
    ui->useNumericKeypadCheck->setChecked(settings.value(SG_USE_NUMERIC_KEYPAD).toBool());
    ui->ledInvertCheck->setChecked(settings.value(SG_LED_INVERT).toBool());

    //Logging settings...
    if(logDisabled) {
        YubiKeyLogger::disableLogging();

        ui->logOutputCheck->setChecked(false);
        ui->logFormatCombo->setEnabled(false);
        ui->logFormatEdit->setEnabled(false);
    } else {
        YubiKeyLogger::enableLogging();

        ui->logOutputCheck->setChecked(true);
        ui->logFormatCombo->setEnabled(true);
        ui->logFormatCombo->setCurrentIndex(logFormat);
        YubiKeyLogger::setLogFormat((YubiKeyLogger::Format)logFormat);
        if(logFormat == YubiKeyLogger::Format_Flexible) {
            QString format = settings.value(SG_LOG_FLEXIBLE).toString();
            ui->logFormatEdit->setEnabled(true);
            ui->logFormatEdit->setText(format);
            YubiKeyLogger::setFlexibleFormat(format);
        } else {
            ui->logFormatEdit->setEnabled(false);
        }
    }

    ui->exportCheck->setChecked(settings.value(SG_EXPORT_PREFERENCE).toBool());

    //Signal everyone
    emit settingsChanged();
}

void SettingPage::save() {
    QSettings settings;

    //General settings...

    //Customer prefix
    int custPrefix = 0;
    if(ui->custPrefixCheck->isChecked()) {
        settings.setValue(SG_CUSTOMER_PREFIX_USED, true);
        custPrefix = ui->custPrefixDecTxt->text().toInt();
    } else {
        settings.setValue(SG_CUSTOMER_PREFIX_USED, false);
    }
    settings.setValue(SG_CUSTOMER_PREFIX, custPrefix);

    // OTP output settings...
    settings.setValue(SG_TAB_FIRST,         ui->tabFirstBtn->isChecked());
    settings.setValue(SG_APPEND_TAB1,       ui->appendTab1Btn->isChecked());
    settings.setValue(SG_APPEND_TAB2,       ui->appendTab2Btn->isChecked());
    settings.setValue(SG_APPEND_CR,         ui->appendCRBtn->isChecked());
    settings.setValue(SG_APPEND_DELAY1,     ui->appendDelay1Check->isChecked());
    settings.setValue(SG_APPEND_DELAY2,     ui->appendDelay2Check->isChecked());

    switch(ui->outCharRateCombo->currentIndex()) {
    case OUT_CHAR_RATE_STD:
        settings.setValue(SG_PACING_10MS,   false);
        settings.setValue(SG_PACING_20MS,   false);
        break;
    case OUT_CHAR_RATE_SLOWDOWN_20:
        settings.setValue(SG_PACING_10MS,   true);
        settings.setValue(SG_PACING_20MS,   false);
        break;
    case OUT_CHAR_RATE_SLOWDOWN_40:
        settings.setValue(SG_PACING_10MS,   false);
        settings.setValue(SG_PACING_20MS,   true);
        break;
    case OUT_CHAR_RATE_SLOWDOWN_60:
        settings.setValue(SG_PACING_10MS,   true);
        settings.setValue(SG_PACING_20MS,   true);
        break;
    }

    //Serial # visibility settings...
    settings.setValue(SG_SR_BTN_VISIBLE,    ui->srBtnVisibleCheck->isChecked());
    settings.setValue(SG_SR_USB_VISIBLE,    ui->srUsbVisibleCheck->isChecked());
    settings.setValue(SG_SR_API_VISIBLE,    ui->srApiVisibleCheck->isChecked());

    //Static Password settings...
    settings.setValue(SG_MAN_UPDATE,        ui->manUpdateCheck->isChecked());

    // Updatable settings...
    settings.setValue(SG_ALLOW_UPDATE, ui->updateCheck->isChecked());

    // Extended settings
    settings.setValue(SG_FAST_TRIG, ui->fastTrigCheck->isChecked());
    settings.setValue(SG_USE_NUMERIC_KEYPAD, ui->useNumericKeypadCheck->isChecked());
    settings.setValue(SG_LED_INVERT, ui->ledInvertCheck->isChecked());

    //Logging settings...
    if(ui->logOutputCheck->isChecked()) {
        settings.setValue(SG_LOG_DISABLED,  false);
        settings.setValue(SG_LOG_FORMAT, ui->logFormatCombo->currentIndex());
        if(ui->logFormatCombo->currentIndex() == YubiKeyLogger::Format_Flexible) {
            settings.setValue(SG_LOG_FLEXIBLE, ui->logFormatEdit->text());
        }
    } else {
        settings.setValue(SG_LOG_DISABLED,  true);
    }

    settings.setValue(SG_EXPORT_PREFERENCE, ui->exportCheck->isChecked());

    //Reload settings
    load();

    showStatusMessage(tr(SETTINGS_SAVED), 0);
}

void SettingPage::restore() {
    //Confirm restore
    //Confirm from client
    switch (
            QMessageBox::question(
                    this, tr(RESTORE_SETTING),
                    tr(WARN_RESTORE_SETTING),
                    tr("&Yes"), tr("&No"), QString::null, 1, 1 ))
    {
    case 0:
        restoreDefaults();
        //Reload settings
        load();
        showStatusMessage(tr(SETTINGS_RESTORED), 0);

        break;
    default:
        break;
    }
}

void SettingPage::on_custPrefixCheck_stateChanged(int state) {
    if(state == 0) {
        ui->custPrefixDecTxt->setEnabled(false);
        ui->custPrefixModhexTxt->setEnabled(false);
        ui->custPrefixHexTxt->setEnabled(false);
    } else {
        ui->custPrefixDecTxt->setEnabled(true);
        ui->custPrefixModhexTxt->setEnabled(true);
        ui->custPrefixHexTxt->setEnabled(true);
    }
}

void SettingPage::on_custPrefixDecTxt_editingFinished() {
    custPrefixChanged(DECIMAL, ui->custPrefixDecTxt->text());
    save();
}

void SettingPage::on_custPrefixModhexTxt_editingFinished() {
    custPrefixChanged(MODHEX, ui->custPrefixModhexTxt->text());
    save();
}

void SettingPage::on_custPrefixHexTxt_editingFinished() {
    custPrefixChanged(HEX, ui->custPrefixHexTxt->text());
    save();
}

void SettingPage::on_doUpdateBtn_clicked() {
    int slot;

    if(ui->updateSlot1Radio->isChecked()) {
        slot = 1;
    } else if(ui->updateSlot2Radio->isChecked()) {
        slot = 2;
    } else {
      emit showStatusMessage(tr(ERR_CONF_SLOT_NOT_SELECTED), 1);
      return;
    }

    if(m_ykConfig != NULL) {
        delete m_ykConfig;
    }
    m_ykConfig = new YubiKeyConfig();

    m_ykConfig->setProgrammingMode(YubiKeyConfig::Mode_Update);
    m_ykConfig->setConfigSlot(slot);

    // set serial
    m_ykConfig->setSerial(QString::number(YubiKeyFinder::getInstance()->serial()));

    // access code
    m_ykConfig->setCurrentAccessCodeTxt(
        ui->configProtectionBox->currentAccessCode());
    m_ykConfig->setNewAccessCodeTxt(
        ui->configProtectionBox->newAccessCode(),
        ui->configProtectionBox->newAccMode());

    if(ui->updateDormantCheck->isChecked()) {
        m_ykConfig->setDormant(true);
    }

    //Write
    connect(YubiKeyWriter::getInstance(), SIGNAL(configWritten(bool, const QString &)),
            this, SLOT(updateConfigWritten(bool, const QString &)));

    YubiKeyWriter::getInstance()->writeConfig(m_ykConfig);
}

void SettingPage::updateConfigWritten(bool written, const QString &msg) {
    disconnect(YubiKeyWriter::getInstance(), SIGNAL(configWritten(bool, const QString &)),
        this, SLOT(updateConfigWritten(bool, const QString &)));

    if(written) {
        qDebug() << "Configuration updated." << msg;
        emit showStatusMessage(tr("Configuration successfully updated.", 0));
    } else {
        qDebug() << "Failed update.";
        emit showStatusMessage(msg, 1);;
    }

}

void SettingPage::on_swapBtn_clicked() {
    if(m_ykConfig != NULL) {
        delete m_ykConfig;
    }
    m_ykConfig = new YubiKeyConfig();

    m_ykConfig->setProgrammingMode(YubiKeyConfig::Mode_Swap);

    // set serial
    m_ykConfig->setSerial(QString::number(YubiKeyFinder::getInstance()->serial()));

    // access code
    m_ykConfig->setCurrentAccessCodeTxt(
        ui->configProtectionBox->currentAccessCode());
    m_ykConfig->setNewAccessCodeTxt(
        ui->configProtectionBox->newAccessCode(),
        ui->configProtectionBox->newAccMode());

    //Write
    connect(YubiKeyWriter::getInstance(), SIGNAL(configWritten(bool, const QString &)),
            this, SLOT(swapWritten(bool, const QString &)));

    YubiKeyWriter::getInstance()->writeConfig(m_ykConfig);
}

void SettingPage::swapWritten(bool written, const QString &msg) {
    disconnect(YubiKeyWriter::getInstance(), SIGNAL(configWritten(bool, const QString &)),
        this, SLOT(swapWritten(bool, const QString &)));

    if(written) {
        qDebug() << "Configurations swapped." << msg;
        emit showStatusMessage(tr("Configuration successfully swapped.", 0));
    } else {
        qDebug() << "Failed swapping." << msg;
        emit showStatusMessage(msg, 1);;
    }
}

void SettingPage::keyFound(bool found, bool* featuresMatrix) {
    if(found) {
        if(featuresMatrix[YubiKeyFinder::Feature_Updatable]) {
            ui->updateBtn->setEnabled(true);
        }
    } else {
        ui->updateBtn->setEnabled(false);
    }
}

void SettingPage::custPrefixChanged(int type, QString src) {
    unsigned char buf[16];
    memset(buf, 0, sizeof(buf));
    size_t bufLen = 0;

    switch(type) {
        // decimal
        case DECIMAL:
            {
                QString tmp = QString::number(src.toULongLong(), 16);
                size_t len = tmp.length();
                if(len % 2 != 0) {
                    len++;
                }
                YubiKeyUtil::qstrClean(&tmp, (size_t)len, true);
                YubiKeyUtil::qstrHexDecode(buf, &bufLen, tmp);
                break;
            }
        // modhex
        case MODHEX:
            YubiKeyUtil::qstrModhexDecode(buf, &bufLen, src);
            break;
        // hex
        case HEX:
            YubiKeyUtil::qstrHexDecode(buf, &bufLen, src);
            break;
    }
    QString hex = YubiKeyUtil::qstrHexEncode(buf, bufLen);
    QString modhex = YubiKeyUtil::qstrModhexEncode(buf, bufLen);
    bool ok = false;
    qulonglong dec = hex.toULongLong(&ok, 16);
    if(dec > 0) {
        ui->custPrefixDecTxt->setText(QString::number(dec));
        ui->custPrefixModhexTxt->setText(modhex);
        ui->custPrefixHexTxt->setText(hex);
    }
}

void SettingPage::reloadSettings() {
    load();
}


text:
package com.microsoft.bingads.v12.adinsight;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlSchemaType;
import javax.xml.bind.annotation.XmlType;

/**
 *
Java class for anonymous complex type.
 *
 *
The following schema fragment specifies the expected content contained within this class.
 *
 *

 * <complexType>
 *   <complexContent>
 *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
 *       <sequence>
 *         <element name="EntityType" type="{http://schemas.datacontract.org/2004/07/Microsoft.BingAds.Advertiser.AdInsight.Api.DataContract.V12.Entity}EntityType" minOccurs="0"/>
 *         <element name="EntityIds" type="{http://schemas.microsoft.com/2003/10/Serialization/Arrays}ArrayOflong" minOccurs="0"/>
 *         <element name="SearchParameters" type="{http://schemas.datacontract.org/2004/07/Microsoft.BingAds.Advertiser.AdInsight.Api.DataContract.V12.Entity.SearchParameters}ArrayOfSearchParameter" minOccurs="0"/>
 *       </sequence>
 *     </restriction>
 *   </complexContent>
 * </complexType>
 *

 *
 *
 */
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "entityType",
    "entityIds",
    "searchParameters"
})
@XmlRootElement(name = "GetAuctionInsightDataRequest", namespace = "Microsoft.Advertiser.AdInsight.Api.Service.V12")
public class GetAuctionInsightDataRequest {

    @XmlElement(name = "EntityType", namespace = "Microsoft.Advertiser.AdInsight.Api.Service.V12")
    @XmlSchemaType(name = "string")
    protected EntityType entityType;
    @XmlElement(name = "EntityIds", namespace = "Microsoft.Advertiser.AdInsight.Api.Service.V12", nillable = true)
    protected ArrayOflong entityIds;
    @XmlElement(name = "SearchParameters", namespace = "Microsoft.Advertiser.AdInsight.Api.Service.V12", nillable = true)
    protected ArrayOfSearchParameter searchParameters;

    /**
     * Gets the value of the entityType property.
     *
     * @return
     *     possible object is
     *     {@link EntityType }
     *
     */
    public EntityType getEntityType() {
        return entityType;
    }

    /**
     * Sets the value of the entityType property.
     *
     * @param value
     *     allowed object is
     *     {@link EntityType }
     *
     */
    public void setEntityType(EntityType value) {
        this.entityType = value;
    }

    /**
     * Gets the value of the entityIds property.
     *
     * @return
     *     possible object is
     *     {@link ArrayOflong }
     *
     */
    public ArrayOflong getEntityIds() {
        return entityIds;
    }

    /**
     * Sets the value of the entityIds property.
     *
     * @param value
     *     allowed object is
     *     {@link ArrayOflong }
     *
     */
    public void setEntityIds(ArrayOflong value) {
        this.entityIds = value;
    }

    /**
     * Gets the value of the searchParameters property.
     *
     * @return
     *     possible object is
     *     {@link ArrayOfSearchParameter }
     *
     */
    public ArrayOfSearchParameter getSearchParameters() {
        return searchParameters;
    }

    /**
     * Sets the value of the searchParameters property.
     *
     * @param value
     *     allowed object is
     *     {@link ArrayOfSearchParameter }
     *
     */
    public void setSearchParameters(ArrayOfSearchParameter value) {
        this.searchParameters = value;
    }

}


text:
include ../../macros.gmk #top level

all:Trafci_deploy
Trafci_deploy:Trafci_installer
Trafci_installer:Trafci_jar
Trafci_jar:
	mvn clean install -DskipTests$
Trafci_installer:
	./getBuildInfo$
	export buildId=`head -n 1 buildId`$
	mvn -f installer_pom.xml -DbldId=${buildId} clean package -DskipTests$
Trafci_deploy:
	zip -r ../clients/trafci.zip -j target/trafciInstaller.jar utils/README
	java -jar target/trafciInstaller.jar -silent -installDir ${TRAF_HOME}

clean:
	mvn -f installer_pom.xml clean
	mvn -f pom.xml clean


text:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<TITLE>
All Classes
</TITLE>

<META NAME="date" CONTENT="2007-04-16">

<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">

All Classes

AbstractGrid

Actor

ActorWorld

BoundedGrid

Bug

Critter

Flower

Grid

Location

Rock

UnboundedGrid

World


text:
using System;
using Tailviewer.Api;

// ReSharper disable once CheckNamespace
namespace Tailviewer.Core
{
	/// <summary>
	/// </summary>
	public static class ColumnDescriptorExtensions
	{
		/// <summary>
		///     Tests if the given value is compatible with the given column's type.
		/// </summary>
		/// <param name="column"></param>
		/// <param name="value"></param>
		/// <returns></returns>
		public static bool IsAssignableFrom(this IColumnDescriptor column, object value)
		{
			var type = column.DataType;
			if (value == null)
			{
				if (type.IsClass || type.IsInterface || (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>)))
				{
					return true;
				}

				return false;
			}

			var valueType = value.GetType();
			if (type.IsAssignableFrom(valueType))
				return true;

			return false;
		}
	}
}


text:
<?php

namespace Servinow\RestaurantDrawerBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Servinow\RestaurantDrawerBundle\Entity\Drawer
 */
class Drawer
{
    /**
     * @var integer $id
     */
    private $id;

    /**
     * @var \Doctrine\Common\Collections\ArrayCollection
     */
    private $simpleObjects;

    /**
     * @var Servinow\EntitiesBundle\Entity\Restaurante
     */
    private $_restaurant;

    /**
     * Constructor
     */
    public function __construct()
    {
        $this->simpleObjects = new \Doctrine\Common\Collections\ArrayCollection();
    }

    /**
     * Set id
     *
     * @param integer $id
     * @return Drawer
     */
    public function setId($id)
    {
        $this->id = $id;

        return $this;
    }

    /**
     * Get id
     *
     * @return integer
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Add simpleObjects
     *
     * @param Servinow\RestaurantDrawerBundle\Entity\SimpleObject $simpleObjects
     * @return Drawer
     */
    public function addSimpleObject(\Servinow\RestaurantDrawerBundle\Entity\SimpleObject $simpleObjects)
    {
        $this->simpleObjects[] = $simpleObjects;

        return $this;
    }

    /**
     * Remove simpleObjects
     *
     * @param Servinow\RestaurantDrawerBundle\Entity\SimpleObject $simpleObjects
     */
    public function removeSimpleObject(\Servinow\RestaurantDrawerBundle\Entity\SimpleObject $simpleObjects)
    {
        $this->simpleObjects->removeElement($simpleObjects);
    }

    /**
     * Get simpleObjects
     *
     * @return Doctrine\Common\Collections\Collection
     */
    public function getSimpleObjects()
    {
        return $this->simpleObjects;
    }

    /**
     * Set _restaurant
     *
     * @param Servinow\EntitiesBundle\Entity\Restaurante $restaurant
     * @return Drawer
     */
    public function setRestaurant(\Servinow\EntitiesBundle\Entity\Restaurante $restaurant = null)
    {
        $this->_restaurant = $restaurant;

        return $this;
    }

    /**
     * Get _restaurant
     *
     * @return Servinow\EntitiesBundle\Entity\Restaurante
     */
    public function getRestaurant()
    {
        return $this->_restaurant;
    }
    /**
     * @var \Doctrine\Common\Collections\ArrayCollection
     */
    private $tableObjects;

    /**
     * @var \Doctrine\Common\Collections\ArrayCollection
     */
    private $floors;

    /**
     * Add tableObjects
     *
     * @param Servinow\RestaurantDrawerBundle\Entity\TableObject $tableObjects
     * @return Drawer
     */
    public function addTableObject(\Servinow\RestaurantDrawerBundle\Entity\TableObject $tableObjects)
    {
        $this->tableObjects[] = $tableObjects;

        return $this;
    }

    /**
     * Remove tableObjects
     *
     * @param Servinow\RestaurantDrawerBundle\Entity\TableObject $tableObjects
     */
    public function removeTableObject(\Servinow\RestaurantDrawerBundle\Entity\TableObject $tableObjects)
    {
        $this->tableObjects->removeElement($tableObjects);
    }

    /**
     * Get tableObjects
     *
     * @return Doctrine\Common\Collections\Collection
     */
    public function getTableObjects()
    {
        return $this->tableObjects;
    }

    /**
     * Add floors
     *
     * @param Servinow\RestaurantDrawerBundle\Entity\FloorObject $floors
     * @return Drawer
     */
    public function addFloor(\Servinow\RestaurantDrawerBundle\Entity\FloorObject $floors)
    {
        $this->floors[] = $floors;

        return $this;
    }

    /**
     * Remove floors
     *
     * @param Servinow\RestaurantDrawerBundle\Entity\FloorObject $floors
     */
    public function removeFloor(\Servinow\RestaurantDrawerBundle\Entity\FloorObject $floors)
    {
        $this->floors->removeElement($floors);
    }

    /**
     * Get floors
     *
     * @return Doctrine\Common\Collections\Collection
     */
    public function getFloors()
    {
        return $this->floors;
    }
}


text:
using System.Configuration;

namespace Codisa.InterwayDocs.Business
{
    /// Class that provides the connection
    /// strings used by the application.
    internal static class Database
    {
        /// Connection string to the InterwayDocs database.
        internal static string InterwayDocsConnection
        {
            get { return ConfigurationManager.ConnectionStrings["InterwayDocs"].ConnectionString; }
        }
    }
}


text:
#include "qpid/broker/SessionManager.h"
#include "qpid/broker/SessionState.h"
#include "qpid/framing/reply_exceptions.h"
#include "qpid/log/Statement.h"
#include "qpid/log/Helpers.h"
#include "qpid/memory.h"

#include <boost/bind.hpp>
#include <boost/range.hpp>

#include <algorithm>
#include <functional>
#include <ostream>

namespace qpid {
namespace broker {

using boost::intrusive_ptr;
using namespace sys;
using namespace framing;

SessionManager::SessionManager(const SessionState::Configuration& c, Broker& b)
    : config(c), broker(b) {}

SessionManager::~SessionManager() {
    detached.clear();           // Must clear before destructor as session dtor will call forget()
}

std::auto_ptr<SessionState>  SessionManager::attach(SessionHandler& h, const SessionId& id, bool/*force*/) {
    Mutex::ScopedLock l(lock);
    eraseExpired();             // Clean up expired table
    std::pair<Attached::iterator, bool> insert = attached.insert(id);
    if (!insert.second)
        throw SessionBusyException(QPID_MSG("Session already attached: " << id));
    Detached::iterator i = std::find(detached.begin(), detached.end(), id);
    std::auto_ptr<SessionState> state;
    if (i == detached.end())
        state.reset(new SessionState(broker, h, id, config));
    else {
        state.reset(detached.release(i).release());
        state->attach(h);
    }
    return state;
    // FIXME aconway 2008-04-29: implement force
}

void  SessionManager::detach(std::auto_ptr<SessionState> session) {
    Mutex::ScopedLock l(lock);
    attached.erase(session->getId());
    session->detach();
    if (session->getTimeout() > 0) {
    session->expiry = AbsTime(now(),session->getTimeout()*TIME_SEC);
    if (session->mgmtObject != 0)
        session->mgmtObject->set_expireTime ((uint64_t) Duration (EPOCH, session->expiry));
        detached.push_back(session.release()); // In expiry order
    eraseExpired();
}
}

void SessionManager::forget(const SessionId& id) {
    Mutex::ScopedLock l(lock);
    attached.erase(id);
}

void SessionManager::eraseExpired() {
    // Called with lock held.
    if (!detached.empty()) {
        // This used to use a more elegant invocation of std::lower_bound
        // but violated the strict weak ordering rule which Visual Studio
        // enforced. See QPID-1424 for more info should you be tempted to
        // replace the loop with something more elegant.
        AbsTime now = AbsTime::now();
        Detached::iterator keep = detached.begin();
        while ((keep != detached.end()) && ((*keep).expiry < now))
            keep++;
        if (detached.begin() != keep) {
            QPID_LOG(debug, "Expiring sessions: " << log::formatList(detached.begin(), keep));
            detached.erase(detached.begin(), keep);
        }
    }
}

}} // namespace qpid::broker


text:
{% extends "wiki/base.html" %}
{% load wiki_tags i18n sekizai_tags %}

{% block wiki_pagetitle %}{{ article.current_revision.title }}{% endblock %}

{% block wiki_breadcrumbs %}
{% include "wiki/includes/breadcrumbs.html" %}
{% endblock %}

{% block wiki_contents %}

          {{ article.current_revision.title }}

            {% if urlpath.parent %}
             {{ urlpath.slug }}
            {% endif %}
            {% if article.current_revision.locked %}
               {% trans "locked" %}
            {% endif %}

      {% include "wiki/includes/article_menu.html" %}

      {% block wiki_contents_tab %}
      {% endblock %}

{% endblock %}

{% block wiki_footer_prepend %}

{% trans "This article was last modified:" %} {{ article.current_revision.modified }}

{% endblock %}


text:
package com.tle.common.workflow.node;

import com.tle.beans.entity.LanguageBundle;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
import org.hibernate.annotations.AccessType;

@Entity(name = "WorkflowParallel")
@AccessType("field")
@DiscriminatorValue("p")
public class ParallelNode extends WorkflowTreeNode {
  private static final long serialVersionUID = 1;

  public ParallelNode(LanguageBundle name) {
    super(name);
  }

  public ParallelNode() {
    super();
  }

  @Override
  public char getType() {
    return 'p';
  }

  @Override
  public boolean canHaveSiblingRejectPoints() {
    return false;
  }
}


text:
title:  PostgreSQL JDBC Driver 42.3.2 Released
date:   2022-02-01 07:35:28 -0500
categories:
    - new_release
version: 42.3.2
---

**Notable changes**
### Known issues
- Regression since 42.3.2: "cursor <unnamed portal 1> does not exist" when using ResultSet.setFetchSize from CallableStatement, fixed in 42.3.6 (see [PG #2377](https://github.com/pgjdbc/pgjdbc/pull/2377))

### Security
- CVE-2022-21724 pgjdbc instantiates plugin instances based on class names provided via authenticationPluginClassName,
  sslhostnameverifier, socketFactory, sslfactory, sslpasswordcallback connection properties.
  However, the driver did not verify if the class implements the expected interface before instantiating the class. This
  would allow a malicious class to be instantiated that could execute arbitrary code from the JVM. Fixed in [commit](https://github.com/pgjdbc/pgjdbc/commit/f4d0ed69c0b3aae8531d83d6af4c57f22312c813)

### Changed
- perf: read in_hot_standby GUC on connection [PR #2334](https://github.com/pgjdbc/pgjdbc/pull/2334)
- test: materialized view privileges [PR #2209](https://github.com/pgjdbc/pgjdbc/pull/2209) fixes [Issue #2060](https://github.com/pgjdbc/pgjdbc/issues/2060)
- docs: add info about convenience maven project [PR #2407](https://github.com/pgjdbc/pgjdbc/pull/2407)
- docs: Document timezone reversal from POSIX to ISO [PR #2413](https://github.com/pgjdbc/pgjdbc/pull/2413)
- fix: we will ask the server if it supports GSS Encryption if gssEncryption
is prefer or require [PR #2396](https://github.com/pgjdbc/pgjdbc/pull/2396) remove the need to have a ticket in the cache before asking the server if gss encryptions are supported
- docs: remove Java 6 and 7 references from contributing [PR #2385](https://github.com/pgjdbc/pgjdbc/pull/2385)
- style: remove Java 8 / JDBC 4.2 checks [PR #2383](https://github.com/pgjdbc/pgjdbc/pull/2383) Remove all remaining checks whether the source is lower than Java 8
or JDBC 4.2.
- fix: throw SQLException for #getBoolean BIT(>1) [PR #2386](https://github.com/pgjdbc/pgjdbc/pull/2386) Throw SQLException instead of ClassCastException when calling
CallableStatement#getBoolean(int) on BIT(>1).
- style: import java.time types in more classes [PR #2382](https://github.com/pgjdbc/pgjdbc/pull/2382) Use imports for java.time types in all remaining classes.
- style: import java.time types in TimestampUtils [PR #2380](https://github.com/pgjdbc/pgjdbc/pull/2380) Use imports for java.time types in TimestampUtils.
- refactor: Change internal constructors to pass only connection Properties
Changes internal constructors for PgConnection and related classes to only accept the connection properties object and
remove the user and password arguments. Any locations that required those fields can retrieve them from the properties map.
- test: Fix DatabaseMetadataTest to perform mview tests only on 9.3+
- perf: read in_hot_standby GUC on connection [PR #2334](https://github.com/pgjdbc/pgjdbc/pull/2334)
- doc: improv doc around binary decoding of numeric data [#2331](https://github.com/pgjdbc/pgjdbc/pull/2331)
- Add cert key type checking to chooseClientAlias [PR #2417](https://github.com/pgjdbc/pgjdbc/pull/2417)

### Added
- feat: Add authenticationPluginClassName option to provide passwords at runtime
Adds authenticationPluginClassName connection property that allows end users to specify a class
that will provide the connection passwords at runtime. Users implementing that interface must
ensure that each invocation of the method provides a new char[] array as the contents
will be filled with zeroes by the driver after use.Call sites within the driver have been updated to use the char[] directly wherever possible.
This includes direct usage in the GSS authentication code paths that internally were already converting the String password into a char[] for internal usage.
This allows configuring a connection with a password that must be generated on the fly or periodically changes. [PR #2369](https://github.com/pgjdbc/pgjdbc/pull/2369) original issue [Issue #2102](https://github.com/pgjdbc/pgjdbc/issues/2102)
- feat: add tcpNoDelay option [PR #2341](https://github.com/pgjdbc/pgjdbc/pull/2341) fixes [Issue #2324](https://github.com/pgjdbc/pgjdbc/issues/2324)
- feat: pg_service.conf and .pgpass support (jdbc:postgresql://?service=my-service) [PR #2260](https://github.com/pgjdbc/pgjdbc/pull/2260) fixes [Issue #2278](https://github.com/pgjdbc/pgjdbc/issues/2278)

### Fixed
- Use local TimestampUtil in PgStatement and PgResultset for thread safety [PR #2291](https://github.com/pgjdbc/pgjdbc/pull/2291)
  fixes [Issue #921](https://github.com/pgjdbc/pgjdbc/issues/921) synchronize modification of shared calendar
- fix: PgObject isNull() was reporting the opposite fixes [Issue #2411](https://github.com/pgjdbc/pgjdbc/issues/2411) [PR #2414](https://github.com/pgjdbc/pgjdbc/pull/2414)
- fix: default file name is ".pg_service.conf" on Windows (not "pg_service.conf") [PR #2398](https://github.com/pgjdbc/pgjdbc/pull/2398) fixes [Issue #2278](https://github.com/pgjdbc/pgjdbc/issues/2278)
- test: Fix RefCursorFetchTest on older platforms
- fix: do not close refcursor after reading if fetchsize has been set fixes [Issue #2227](https://github.com/pgjdbc/pgjdbc/issues/2227) [PR #2371](https://github.com/pgjdbc/pgjdbc/pull/2371)
- fix: rework gss authentication to use the principal name to get the credentials fixes [Issue #2235](https://github.com/pgjdbc/pgjdbc/issues/2235) [PR #2352](https://github.com/pgjdbc/pgjdbc/pull/2352)
- fix: return getIndexInfo metadata columns in UPPER CASE [PR #2368](https://github.com/pgjdbc/pgjdbc/pull/2368)
- fix: Connection leak in ConnectionFactoryImpl#tryConnect [PR #2350](https://github.com/pgjdbc/pgjdbc/pull/2350) [Issue #2351](https://github.com/pgjdbc/pgjdbc/issues/2351)
- fix: Fix For IS_AUTOGENERATED Flag [PR #2348](https://github.com/pgjdbc/pgjdbc/pull/2348)
- fix: parsing service file tests for windows [PR #2347](https://github.com/pgjdbc/pgjdbc/pull/2347)
- fix: The spec says that calling close() on a closed connection is a noop. [PR #2345](https://github.com/pgjdbc/pgjdbc/pull/2345) fixes [Issue #2300](https://github.com/pgjdbc/pgjdbc/issues/2300)
- fix: add microsecond precision to getTimestamp() called on sql TIME(6) Currently, "when fetching a value of type TIME(6) through
resultSet.getTimestamp() only ms precision is retained, the microsecond fractional digits are lost." This change will retain the microsecond
precision when .getTimestamp() is called on TIME(6). [PR #2181](https://github.com/pgjdbc/pgjdbc/pull/2181) Closes [Issue #1537](https://github.com/pgjdbc/pgjdbc/issues/1537)
- test: materialized view privileges [PR #2209](https://github.com/pgjdbc/pgjdbc/pull/2209) add and drop a materialized view
Add to TestUtil and also to DatabaseMetaData setup and teardown fixes [Issue #2060](https://github.com/pgjdbc/pgjdbc/issues/2060)
- fix: typo in connect.md [PR #2338](https://github.com/pgjdbc/pgjdbc/pull/2238) `OutOfMemoryException` => `OutOfMemoryError`
- fix: use local TimestampUtil in PgStatement and PgResultset for thread
safety TimestampUtil is not thread safe. It raises exceptions when multiple threads use ResultSets of one connection. [PR #2291](https://github.com/pgjdbc/pgjdbc/pull/2291)
fixes [Issue #921](https://github.com/pgjdbc/pgjdbc/issues/921)
If PgStatement and PgResultSet use their own TimestampUtil no synchronize is needed.
- fix: typo in CONTRIBUTING.md [PR #2332](https://github.com/pgjdbc/pgjdbc/pull/2332) seccion => section

**Commits by author**

Andrei Paikin (1):

* minor: fix checkstyle violations for empty lines in enum [PR 2426](https://github.com/pgjdbc/pgjdbc/pull/2426)

Brett Okken (1):

* doc: improv doc around binary decoding of numeric data [PR 2331](https://github.com/pgjdbc/pgjdbc/pull/2331)

Dave Cramer (21):

* move comment to appropriate place and add explanation [PR 2336](https://github.com/pgjdbc/pgjdbc/pull/2336)
* bump version in readme and gradle.properties [PR 2335](https://github.com/pgjdbc/pgjdbc/pull/2335)
* add entries for latest changes [PR 2339](https://github.com/pgjdbc/pgjdbc/pull/2339)
* Ms goodman time gettimestamp micros [PR 2181](https://github.com/pgjdbc/pgjdbc/pull/2181)
* add TCP No Delay option fixes Issue [PR 2324](https://github.com/pgjdbc/pgjdbc/pull/2324) (#2341)
* fix Issue [PR 2300](https://github.com/pgjdbc/pgjdbc/pull/2300). The spec says that calling close() on a closed connection is a noop. (#2345)
* fix: parsing service file tests for windows [PR 2347](https://github.com/pgjdbc/pgjdbc/pull/2347)
* fix: return getIndexInfo metadata columns in UPPER CASE [PR 2368](https://github.com/pgjdbc/pgjdbc/pull/2368)
* fix: rework gss authentication to use the principal name to get the credentials fixes Issue [PR 2235](https://github.com/pgjdbc/pgjdbc/pull/2235) (#2352)
* Removed unsafe package and native kerberos ticket check [PR 2363](https://github.com/pgjdbc/pgjdbc/pull/2363)
* log4jmessage [PR 2370](https://github.com/pgjdbc/pgjdbc/pull/2370)
* Put back GSSCallbackHandler. Avoid using forbidden api [PR 2373](https://github.com/pgjdbc/pgjdbc/pull/2373)
* fix: do not close refcursor after reading if fetchsize has been set fixes ISSUE [PR 2227](https://github.com/pgjdbc/pgjdbc/pull/2227) (#2371)
* perf: add read(b,o,l) to BlobInputStream [PR 2376](https://github.com/pgjdbc/pgjdbc/pull/2376)
* change the default directory returned on windows to APPDATA/postgresql since that is what we end up using anyway [PR 2402](https://github.com/pgjdbc/pgjdbc/pull/2402)
* fix: we will ask the server if it supports GSS Encryption if gssEncryption is prefer or require [PR 2396](https://github.com/pgjdbc/pgjdbc/pull/2396)
* docs: Document timezone reversal from POSIX to ISO [PR 2413](https://github.com/pgjdbc/pgjdbc/pull/2413)
* fix: PgObject isNull() was reporting the opposite fixes Issue [PR 2411](https://github.com/pgjdbc/pgjdbc/pull/2411) (#2414)
* remove skipjre6 and skipjre7 [PR 2415](https://github.com/pgjdbc/pgjdbc/pull/2415)
* Revert "perf: add read(b,o,l) to BlobInputStream [PR 2376](https://github.com/pgjdbc/pgjdbc/pull/2376)" (#2422)
* Changelog42.3.2 [PR 2418](https://github.com/pgjdbc/pgjdbc/pull/2418)

JoelRabinovitch (1):

* fixForIsAutoGenerated Fix For IS_AUTOGENERATED Flag [PR 2348](https://github.com/pgjdbc/pgjdbc/pull/2348)

Marek Läll (2):

* Issue 2278 ; jdbc:postgresql://?service= ; pg_service.conf ; .pgpass [PR 2282](https://github.com/pgjdbc/pgjdbc/pull/2282)
* fix: default file name is ".pg_service.conf" on Windows (not "pg_service.conf") [PR 2398](https://github.com/pgjdbc/pgjdbc/pull/2398)

Mark Grobaker (1):

* test: materialized view privileges [PR 2209](https://github.com/pgjdbc/pgjdbc/pull/2209)

Michał Wyrzykowski (1):

* fix: Connection leak in ConnectionFactoryImpl#tryConnect [PR 2350](https://github.com/pgjdbc/pgjdbc/pull/2350) (#2351)

Nick Burgan (1):

* Add cert key type checking to chooseClientAlias [PR 2417](https://github.com/pgjdbc/pgjdbc/pull/2417)

Philippe Marschall (6):

* style: fix typos in pgobject javadoc [PR 2379](https://github.com/pgjdbc/pgjdbc/pull/2379)
* style: import java.time types in TimestampUtils [PR 2380](https://github.com/pgjdbc/pgjdbc/pull/2380)
* style: import java.time types in more classes [PR 2382](https://github.com/pgjdbc/pgjdbc/pull/2382)
* fix: throw SQLException for #getBoolean BIT(>1) [PR 2386](https://github.com/pgjdbc/pgjdbc/pull/2386)
* style: remove Java 8 / JDBC 4.2 checks [PR 2383](https://github.com/pgjdbc/pgjdbc/pull/2383)
* docs: remove Java 6 and 7 references from contributing [PR 2385](https://github.com/pgjdbc/pgjdbc/pull/2385)

Sehrope Sarkuni (9):

* feat: Change AuthenticationPlugin interface to use char[] rather than String [PR 2420](https://github.com/pgjdbc/pgjdbc/pull/2420)
* test: Disable no-arg callable statement tests in simple query mode [PR 2419](https://github.com/pgjdbc/pgjdbc/pull/2419)
* test: Remove extra catch-fail in RefCursorFetchTest [PR 2391](https://github.com/pgjdbc/pgjdbc/pull/2391)
* test: Fix RefCursorFetchTest on older platforms [PR 2391](https://github.com/pgjdbc/pgjdbc/pull/2391)
* feat: Add authenticationPluginClassName option to provide passwords at runtime [PR 2369](https://github.com/pgjdbc/pgjdbc/pull/2369)
* test: Add TestUtil.assumeHaveMinimumServerVersion(...) helper [PR 2369](https://github.com/pgjdbc/pgjdbc/pull/2369)
* refactor: Change internal constructors to pass only connection Properties [PR 2369](https://github.com/pgjdbc/pgjdbc/pull/2369)
* refactor: Use multi-catch for exceptions in ConnectionFactoryImpl [PR 2369](https://github.com/pgjdbc/pgjdbc/pull/2369)
* test: Fix DatabaseMetadataTest to perform mview tests only on 9.3+ [PR 2340](https://github.com/pgjdbc/pgjdbc/pull/2340)

Sergey Nuyanzin (4):

* [typo] typo in CONTRIBUTING.md [PR 2332](https://github.com/pgjdbc/pgjdbc/pull/2332)
* [typo] in connect.md [PR 2338](https://github.com/pgjdbc/pgjdbc/pull/2338)
* Misprint in messages_ru.java [PR 2358](https://github.com/pgjdbc/pgjdbc/pull/2358)

Sergey Prytkov (1):

* perf: read in_hot_standby GUC on connection [PR 2334](https://github.com/pgjdbc/pgjdbc/pull/2334)

Zuzana Miklankova (1):

* docs: add info about convenience maven project [PR 2407](https://github.com/pgjdbc/pgjdbc/pull/2407)

marcmuel (1):

* fix: use local TimestampUtil in PgStatement and PgResultset for thread safety [PR 2291](https://github.com/pgjdbc/pgjdbc/pull/2291)

### Contributors to this release

We thank the following people for their contributions to this release.

[Pavel Raiskup](https://github.com/praiskup)
[Sehrope Sarkuni](https://github.com/sehrope)
[Andrei Paikin](https://github.com/strkkk)
[Nick Burgan](https://github.com/nmburgan)
[Zuzana Miklankova](https://github.com/zmiklank)
[Marek Läll](https://github.com/MarekUniq)
[Philippe Marschall](https://github.com/marschall)
[Sergey Nuyanzin](https://github.com/snuyanzin)
[Michał Wyrzykowski](https://github.com/wyrzyk)
[JoelRabinovitch](https://github.com/JoelRabinovitch)
[Mark Grobaker](https://github.com/mgrobaker)
[Sergey Prytkov](https://github.com/Rattenkrieg)
[marcmuel](https://github.com/marcmuel)
[Brett Okken](https://github.com/bokken)


text:
var searchData=
[
  ['image_20creation',['Image Creation',['../group__module__glimg__creation.html',1,'']]],
  ['image_20format',['Image Format',['../group__module__glimg__format.html',1,'']]],
  ['imageset',['ImageSet',['../group__module__glimg__imageset.html',1,'']]],
  ['image_20loaders',['Image Loaders',['../group__module__glimg__loaders.html',1,'']]],
  ['immediate_20mesh_20drawing',['Immediate Mesh Drawing',['../group__module__glmesh__draw.html',1,'']]]
];


text:
{% extends "manage/manage_base.html" %}
{% load i18n %}

{% block help_link %}user/management/marketing/vouchers.html{% endblock %}
{% block section %}add-voucher-group{% endblock %}
{% block left-slot-wrapper %}{% endblock %}

{% block content %}

{% trans 'Add voucher group' %}

              {% trans 'Add voucher group' %}

            <form method="post">
                {% csrf_token %}
                {% include "manage/lfs_form.html" %}
                <input type="submit"
                       class="button"
                       value="{% trans 'Add voucher group' %}" />
                <input type="button"
                       class="button"
                       onclick="window.location='{{ came_from }}'"
                       value="{% trans 'Cancel' %}" />
            </form>

{% endblock %}


text:
namespace impeller {

PaintPassDelegate::PaintPassDelegate(Paint paint, std::optional<Rect> coverage)
    : paint_(std::move(paint)), coverage_(coverage) {}

// |EntityPassDelgate|
PaintPassDelegate::~PaintPassDelegate() = default;

// |EntityPassDelgate|
std::optional<Rect> PaintPassDelegate::GetCoverageRect() {
  return coverage_;
}

// |EntityPassDelgate|
bool PaintPassDelegate::CanElide() {
  return paint_.blend_mode == BlendMode::kDestination;
}

// |EntityPassDelgate|
bool PaintPassDelegate::CanCollapseIntoParentPass() {
  return false;
}

// |EntityPassDelgate|
std::shared_ptr<Contents> PaintPassDelegate::CreateContentsForSubpassTarget(
    std::shared_ptr<Texture> target,
    const Matrix& effect_transform) {
  auto contents = TextureContents::MakeRect(Rect::MakeSize(target->GetSize()));
  contents->SetTexture(target);
  contents->SetSourceRect(Rect::MakeSize(target->GetSize()));
  contents->SetOpacity(paint_.color.alpha);
  contents->SetDeferApplyingOpacity(true);
  return paint_.WithFiltersForSubpassTarget(std::move(contents),
                                            effect_transform);
}

}  // namespace impeller


text:
@interface MISCriteria ()
@property (nonatomic, assign, readwrite) MISCriteriaType type;
@property (nonatomic, assign, readwrite) MISCriteriaOperator op;
@property (nonatomic, copy, readwrite) NSString *lhs;
@property (nonatomic, retain, readwrite) NSString *rhs;
@end

@implementation MISCriteria

+ (instancetype)criteriaWithType:(MISCriteriaType)type lhs:(NSString *)lhs op:(MISCriteriaOperator)op rhs:(id)rhs {
    return [[[self alloc] initWithType:type lhs:lhs op:op rhs:rhs] autorelease];
}

- (instancetype)initWithType:(MISCriteriaType)type lhs:(NSString *)lhs op:(MISCriteriaOperator)op rhs:(id)rhs {
    TDAssert([lhs length]);
    TDAssert(rhs);
    self = [super init];
    if (self) {
        self.type = type;
        self.lhs = lhs;
        self.op = op;
        self.rhs = rhs;
    }
    return self;
}

- (void)dealloc {
    self.lhs = nil;
    self.rhs = nil;
    [super dealloc];
}

- (NSString *)generateSql {
    NSString *sql = nil;

    switch (_op) {
        case MISCriteriaOperatorEqualTo:
            sql = [NSString stringWithFormat:@"%@ = %@", _lhs, _rhs];
            break;
        case MISCriteriaOperatorNotEqualTo:
            sql = [NSString stringWithFormat:@"%@ != %@", _lhs, _rhs];
            break;
        case MISCriteriaOperatorLessThan:
            sql = [NSString stringWithFormat:@"%@ < %@", _lhs, _rhs];
            break;
        case MISCriteriaOperatorGreaterThan:
            sql = [NSString stringWithFormat:@"%@ > %@", _lhs, _rhs];
            break;
        case MISCriteriaOperatorLessThanOrEqualTo:
            sql = [NSString stringWithFormat:@"%@ <= %@", _lhs, _rhs];
            break;
        case MISCriteriaOperatorGreaterThanOrEqualTo:
            sql = [NSString stringWithFormat:@"%@ >= %@", _lhs, _rhs];
            break;
        case MISCriteriaOperatorLike:
            sql = [NSString stringWithFormat:@"UPPER(%@) LIKE UPPER('%@')", _lhs, _rhs];
            break;
        default:
            TDAssert(0);
            break;
    }

    return sql;
}

@end


text:
import com.codizer.view.LoginUISingleton;

/**
 *
 * @author Adrian Ortiz
 *
 */
public class Init {

	/**
	 * Aplicación de pull
	 * @param args
	 */
	public static void main(String[] args) {
		LoginUISingleton loginUI = LoginUISingleton.getInstance();
		loginUI.setVisible(true);
	}
}


text:
import { ReverseChainingContextualSingleSubstitutionTable } from '../tables.js';
import { LookupTree, LookupTreeEntry } from '../types.js';

import { listGlyphsByIndex } from './coverage.js';
import { processLookaheadPosition, processBacktrackPosition, EntryMeta } from './helper.js';

/**
 * Build lookup tree for GSUB lookup table 8, format 1.
 * https://docs.microsoft.com/en-us/typography/opentype/spec/gsub#81-reverse-chaining-contextual-single-substitution-format-1-coverage-based-glyph-contexts
 *
 * @param table JSON representation of the table
 * @param tableIndex Index of this table in the overall lookup
 */
export function buildTree(table: ReverseChainingContextualSingleSubstitutionTable, tableIndex: number): LookupTree {
  const result: LookupTree = {
    individual: new Map<number, LookupTreeEntry>(),
    range: []
  };

  const glyphs = listGlyphsByIndex(table.coverage);

  for (const { glyphId, index } of glyphs) {
    const initialEntry: LookupTreeEntry = {};
    if (Array.isArray(glyphId)) {
      result.range.push({
        entry: initialEntry,
        range: glyphId
      });
    } else {
      result.individual.set(glyphId, initialEntry);
    }

    let currentEntries: EntryMeta[] = [{
      entry: initialEntry,
      substitutions: [table.substitutes[index]]
    }];

    // We walk forward, then backward
    for (const coverage of table.lookaheadCoverage) {
      currentEntries = processLookaheadPosition(
        listGlyphsByIndex(coverage).map(glyph => glyph.glyphId),
        currentEntries
      );
    }

    for (const coverage of table.backtrackCoverage) {
      currentEntries = processBacktrackPosition(
        listGlyphsByIndex(coverage).map(glyph => glyph.glyphId),
        currentEntries
      );
    }

    // When we get to the end, insert the lookup information
    for (const { entry, substitutions } of currentEntries) {
      entry.lookup = {
        substitutions,
        index: tableIndex,
        subIndex: 0,
        length: 1,
        contextRange: [
          -1 * table.backtrackCoverage.length,
          1 + table.lookaheadCoverage.length
        ]
      };
    }
  }

  return result;
}


text:
require 'chef/formatters/base'
require 'chef/config'

class Chef
  module Formatters
    #--
    # TODO: not sold on the name, but the output is similar to what rspec calls
    # "specdoc"
    class Doc < Formatters::Base

      attr_reader :start_time, :end_time
      cli_name(:doc)

      def initialize(out, err)
        super

        @updated_resources = 0
        @up_to_date_resources = 0
        @start_time = Time.now
        @end_time = @start_time
      end

      def elapsed_time
        end_time - start_time
      end

      def run_start(version)
        puts "Starting Chef Client, version #{version}"
      end

      def total_resources
        @up_to_date_resources + @updated_resources
      end

      def run_completed(node)
        @end_time = Time.now
        if Chef::Config[:why_run]
          puts "Chef Client finished, #{@updated_resources}/#{total_resources} resources would have been updated"
        else
          puts "Chef Client finished, #{@updated_resources}/#{total_resources} resources updated in #{elapsed_time} seconds"
        end
      end

      def run_failed(exception)
        @end_time = Time.now
        if Chef::Config[:why_run]
          puts "Chef Client failed. #{@updated_resources} resources would have been updated"
        else
          puts "Chef Client failed. #{@updated_resources} resources updated in #{elapsed_time} seconds"
        end
      end

      # Called right after ohai runs.
      def ohai_completed(node)
      end

      # Already have a client key, assuming this node has registered.
      def skipping_registration(node_name, config)
      end

      # About to attempt to register as +node_name+
      def registration_start(node_name, config)
        puts "Creating a new client identity for #{node_name} using the validator key."
      end

      def registration_completed
      end

      def node_load_start(node_name, config)
      end

      # Failed to load node data from the server
      def node_load_failed(node_name, exception, config)
        super
      end

      # Default and override attrs from roles have been computed, but not yet applied.
      # Normal attrs from JSON have been added to the node.
      def node_load_completed(node, expanded_run_list, config)
      end

      # Called before the cookbook collection is fetched from the server.
      def cookbook_resolution_start(expanded_run_list)
        puts "resolving cookbooks for run list: #{expanded_run_list.inspect}"
      end

      # Called when there is an error getting the cookbook collection from the
      # server.
      def cookbook_resolution_failed(expanded_run_list, exception)
        super
      end

      # Called when the cookbook collection is returned from the server.
      def cookbook_resolution_complete(cookbook_collection)
      end

      # Called before unneeded cookbooks are removed
      def cookbook_clean_start
      end

      # Called after the file at +path+ is removed. It may be removed if the
      # cookbook containing it was removed from the run list, or if the file was
      # removed from the cookbook.
      def removed_cookbook_file(path)
      end

      # Called when cookbook cleaning is finished.
      def cookbook_clean_complete
      end

      # Called before cookbook sync starts
      def cookbook_sync_start(cookbook_count)
        puts "Synchronizing Cookbooks:"
      end

      # Called when cookbook +cookbook_name+ has been sync'd
      def synchronized_cookbook(cookbook_name)
        puts "  - #{cookbook_name}"
      end

      # Called when an individual file in a cookbook has been updated
      def updated_cookbook_file(cookbook_name, path)
      end

      # Called after all cookbooks have been sync'd.
      def cookbook_sync_complete
      end

      # Called when cookbook loading starts.
      def library_load_start(file_count)
        puts "Compiling Cookbooks..."
      end

      # Called after a file in a cookbook is loaded.
      def file_loaded(path)
      end

      # Called when recipes have been loaded.
      def recipe_load_complete
      end

      # Called before convergence starts
      def converge_start(run_context)
        puts "Converging #{run_context.resource_collection.all_resources.size} resources"
      end

      # Called when the converge phase is finished.
      def converge_complete
      end

      # Called before action is executed on a resource.
      def resource_action_start(resource, action, notification_type=nil, notifier=nil)
        if resource.cookbook_name && resource.recipe_name
          resource_recipe = "#{resource.cookbook_name}::#{resource.recipe_name}"
        else
          resource_recipe = "<Dynamically Defined Resource>"
        end

        if resource_recipe != @current_recipe
          puts "Recipe: #{resource_recipe}"
          @current_recipe = resource_recipe
        end
        # TODO: info about notifies
        print "  * #{resource} action #{action}"
      end

      # Called when a resource fails, but will retry.
      def resource_failed_retriable(resource, action, retry_count, exception)
      end

      # Called when a resource fails and will not be retried.
      def resource_failed(resource, action, exception)
        super
      end

      # Called when a resource action has been skipped b/c of a conditional
      def resource_skipped(resource, action, conditional)
        # TODO: more info about conditional
        puts " (skipped due to #{conditional.short_description})"
      end

      # Called after #load_current_resource has run.
      def resource_current_state_loaded(resource, action, current_resource)
      end

      # Called when a resource has no converge actions, e.g., it was already correct.
      def resource_up_to_date(resource, action)
        @up_to_date_resources+= 1
        puts " (up to date)"
      end

      def resource_bypassed(resource, action, provider)
        puts " (Skipped: whyrun not supported by provider #{provider.class.name})"
      end

      def output_record(line)

      end

      # Called when a change has been made to a resource. May be called multiple
      # times per resource, e.g., a file may have its content updated, and then
      # its permissions updated.
      def resource_update_applied(resource, action, update)
        prefix = Chef::Config[:why_run] ? "Would " : ""
        Array(update).each do |line|
          next if line.nil?
          output_record line
          if line.kind_of? String
            @output.color "\n    - #{prefix}#{line}", :green
          elsif line.kind_of? Array
            # Expanded output - delta
            # @todo should we have a resource_update_delta callback?
            line.each do |detail|
              @output.color "\n        #{detail}", :white
            end
          end
        end
      end

      # Called after a resource has been completely converged.
      def resource_updated(resource, action)
        @updated_resources += 1
        puts "\n"
      end

      # Called when resource current state load is skipped due to the provider
      # not supporting whyrun mode.
      def resource_current_state_load_bypassed(resource, action, current_resource)
        @output.color("\n    * Whyrun not supported for #{resource}, bypassing load.", :yellow)
      end

      # Called before handlers run
      def handlers_start(handler_count)
        puts "\nRunning handlers:"
      end

      # Called after an individual handler has run
      def handler_executed(handler)
        puts "  - #{handler.class.name}"
      end

      # Called after all handlers have executed
      def handlers_completed
        puts "Running handlers complete\n"
      end

      # Called when a provider makes an assumption after a failed assertion
      # in whyrun mode, in order to allow execution to continue
      def whyrun_assumption(action, resource, message)
        return unless message
        [ message ].flatten.each do |line|
          @output.color("\n    * #{line}", :yellow)
        end
      end

      # Called when an assertion declared by a provider fails
      def provider_requirement_failed(action, resource, exception, message)
        return unless message
        color = Chef::Config[:why_run] ? :yellow : :red
        [ message ].flatten.each do |line|
          @output.color("\n    * #{line}", color)
        end
      end
    end
  end
end


text:
title: 'W18: Applications & Implications'
assignment: "Propose a final project that integrates the range of units covered"
goal: ""
links: []

layout: lesson
previous: fabacademy/week-17/index.md
next: fabacademy/week-19/index.md
---

## Table of Contents

* TOC
{:toc}

---

## Applications & Implications

### What will it do?

A color- and brightness-adjustable LED-lamp that imitates sunlight during the course of the day. It oscillates between warm (~2500K) and cold (~5000K) white, synced with the sun, based on its location. Features a smartphone app.

### Who's done what beforehand?

I've done a small experiment in that direction about two years ago, using a pre-made Arduino, pre-made LED modules  and PT4115E driver boards.

### What materials and components will be required? / Where will they come from?

- [Electronics]({{ site.baseurl }}/illuminative/electronics.html) (lab stock / farnell)
	- + external wall adapter (24V 2A) (lab stock)
- Copper sheet for the heat sink (lab stock)
- Housing
	- Glass pipe (local glass blower)
	- Composite (raw materials from lab stock)

### How much will it cost?

### What parts and systems will be made?

- **LED modules** – arrays of two different types of LEDs, separately controllable
- **Controller Board** - based on ATMega328 / [I²DC]({{ site.baseurl }}/i2dc/index.html) two filtered PWM channels, serial bluetooth interface
- **Housing** – Glass pipe + end caps
- **Physical UI**
- **Android App**

### What processes will be used?

- PCB Milling
- Reflow Soldering
- CNC Milling
- Composites
- 3D Printing

### What tasks need to be completed?

### What questions need to be answered?

### What is the schedule?

### How will it be evaluated?

- Successful production of the hardware is necessary. This includes:
	- Molding the shade
	- Casting the end caps
- A working 2-channel PWM driver is required
- Smartphone control is mandatory (color & brightness)
- Sun tracking is optional