text:
package com.jassmp.Dialogs;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.widget.Toast;

import com.jassmp.R;

public class ScanFrequencyDialog extends DialogFragment {

    private Activity parentActivity;
    private int      selectedIndex;

    private static final String SCAN_FREQUENCY = "SCAN_FREQUENCY";

    private static boolean CALLED_FROM_WELCOME = false;

    @Override
    public Dialog onCreateDialog( Bundle savedInstanceState ) {

        parentActivity = getActivity();

        final SharedPreferences sharedPreferences = parentActivity.
                                                                          getSharedPreferences( "com.jams.music.player",
                                                                                Context.MODE_PRIVATE );

        AlertDialog.Builder builder = new AlertDialog.Builder( getActivity() );

        CALLED_FROM_WELCOME = this.getArguments().getBoolean( "CALLED_FROM_WELCOME" );

        //Check which theme is currently selected and set the appropriate flag.
        if( sharedPreferences.getInt( SCAN_FREQUENCY, 5 ) == 0 ) {
            selectedIndex = 0;
        } else if( sharedPreferences.getInt( SCAN_FREQUENCY, 5 ) == 1 ) {
            selectedIndex = 1;
        } else if( sharedPreferences.getInt( SCAN_FREQUENCY, 5 ) == 2 ) {
            selectedIndex = 2;
        } else if( sharedPreferences.getInt( SCAN_FREQUENCY, 5 ) == 3 ) {
            selectedIndex = 3;
        } else if( sharedPreferences.getInt( SCAN_FREQUENCY, 5 ) == 4 ) {
            selectedIndex = 4;
        } else if( sharedPreferences.getInt( SCAN_FREQUENCY, 5 ) == 5 ) {
            selectedIndex = 5;
        }

        /*************************************************************************************************
         * Scan Frequency Settings:
         *
         * 0: Scan at every startup.
         * 1: Scan at every 3 startups.
         * 2: Scan at every 5 startups.
         * 3: Scan at every 10 startups.
         * 4: Scan at every 20 startups.
         * 5: Scan Manually.
         *************************************************************************************************/

        //Set the dialog title.
        builder.setTitle( R.string.scan_frequency );
        builder.setSingleChoiceItems( R.array.scan_frequency_choices, selectedIndex, new OnClickListener() {

            @Override
            public void onClick( DialogInterface dialog, int which ) {

                if( which == 0 ) {
                    sharedPreferences.edit().putInt( SCAN_FREQUENCY, 5 ).commit();

                    dialog.dismiss();
                    getActivity().finish();
                    Toast.makeText( parentActivity, R.string.changes_saved, Toast.LENGTH_SHORT ).show();

                } else if( which == 1 ) {
                    sharedPreferences.edit().putInt( SCAN_FREQUENCY, 1 ).commit();

                    dialog.dismiss();
                    getActivity().finish();
                    Toast.makeText( parentActivity, R.string.changes_saved, Toast.LENGTH_SHORT ).show();

                } else if( which == 2 ) {
                    sharedPreferences.edit().putInt( SCAN_FREQUENCY, 2 ).commit();

                    dialog.dismiss();
                    getActivity().finish();
                    Toast.makeText( parentActivity, R.string.changes_saved, Toast.LENGTH_SHORT ).show();

                } else if( which == 3 ) {
                    sharedPreferences.edit().putInt( SCAN_FREQUENCY, 3 ).commit();

                    dialog.dismiss();
                    getActivity().finish();
                    Toast.makeText( parentActivity, R.string.changes_saved, Toast.LENGTH_SHORT ).show();

                } else if( which == 4 ) {
                    sharedPreferences.edit().putInt( SCAN_FREQUENCY, 4 ).commit();

                    dialog.dismiss();
                    getActivity().finish();
                    Toast.makeText( parentActivity, R.string.changes_saved, Toast.LENGTH_SHORT ).show();

                } else if( which == 5 ) {
                    sharedPreferences.edit().putInt( SCAN_FREQUENCY, 5 ).commit();

                    dialog.dismiss();
                    getActivity().finish();
                    Toast.makeText( parentActivity, R.string.changes_saved, Toast.LENGTH_SHORT ).show();

                }

            }

        } );

        return builder.create();
    }

    @Override
    public void onPause() {
        super.onPause();

        if( CALLED_FROM_WELCOME == false ) {
            getActivity().finish();
        }

    }

    @Override
    public void onDestroy() {
        super.onDestroy();

        if( CALLED_FROM_WELCOME == false ) {
            getActivity().finish();
        }

    }

}


text:
package darks.grid.config;

public class TaskConfig
{

	private int jobsExecCount = Runtime.getRuntime().availableProcessors() * 5;

	public TaskConfig()
	{

	}

	public int getJobsExecCount()
	{
		return jobsExecCount;
	}

	public void setJobsExecCount(int jobsExecCount)
	{
		this.jobsExecCount = jobsExecCount;
	}

	@Override
	public String toString()
	{
		return "TaskConfig [jobsExecCount=" + jobsExecCount + "]";
	}

}

redpajama_set_name: RedPajamaGithub


text:
package com.microsoft.azure.management.datafactory.v2018_06_01;

import java.util.List;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.annotation.JsonTypeName;

/**
 * A copy activity source for various relational databases.
 */
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type", defaultImpl = RelationalSource.class)
@JsonTypeName("RelationalSource")
public class RelationalSource extends CopySource {
    /**
     * Database query. Type: string (or Expression with resultType string).
     */
    @JsonProperty(value = "query")
    private Object query;

    /**
     * Specifies the additional columns to be added to source data. Type: array
     * of objects (or Expression with resultType array of objects).
     */
    @JsonProperty(value = "additionalColumns")
    private List<AdditionalColumns> additionalColumns;

    /**
     * Get database query. Type: string (or Expression with resultType string).
     *
     * @return the query value
     */
    public Object query() {
        return this.query;
    }

    /**
     * Set database query. Type: string (or Expression with resultType string).
     *
     * @param query the query value to set
     * @return the RelationalSource object itself.
     */
    public RelationalSource withQuery(Object query) {
        this.query = query;
        return this;
    }

    /**
     * Get specifies the additional columns to be added to source data. Type: array of objects (or Expression with resultType array of objects).
     *
     * @return the additionalColumns value
     */
    public List<AdditionalColumns> additionalColumns() {
        return this.additionalColumns;
    }

    /**
     * Set specifies the additional columns to be added to source data. Type: array of objects (or Expression with resultType array of objects).
     *
     * @param additionalColumns the additionalColumns value to set
     * @return the RelationalSource object itself.
     */
    public RelationalSource withAdditionalColumns(List<AdditionalColumns> additionalColumns) {
        this.additionalColumns = additionalColumns;
        return this;
    }

}


text:
Ext.define('MCLM.view.addlayer.kml.UploadKmlWindow', {
	extend: 'Ext.Window',
	xtype : 'view.uploadKmlWindow',
	id : 'uploadKmlWindow',

    requires: [
        'MCLM.view.addlayer.kml.UploadKmlController',
        'MCLM.view.addlayer.kml.UploadKmlForm',
	],
    controller : 'uploadKml',
    modal : true,
	width : 500,
	height: 250,
    scrollable: false,
    frame : false,
	layout : 'border',
	constrain: true,
	bodyStyle:"background:#FFFFFF;",
	renderTo: Ext.getBody(),

	items: [{
		xtype: 'view.uploadKmlForm'
	}],

});


text:
<?php

namespace AquaIo\Api;

use AquaIo\HttpClient\HttpClient;

/**
 * Returns an ICD-9 code.
 */
class Icd9
{

    private $client;

    public function __construct(HttpClient $client)
    {
        $this->client = $client;
    }

    /**
     * Returns all top-level ICD-9 codes. Useful for helping a user navigate down the ICD-9 hierarchy to find a code.
     *
     * 'codes/v1/icd9' GET
     */
    public function topLevelCodes(array $options = array())
    {
        $body = (isset($options['query']) ? $options['query'] : array());

        $response = $this->client->get('codes/v1/icd9', $body, $options);

        return $response;
    }

    /**
     * Returns a single code matching the name, if any exists. Replace periods with hypens (e.g. '066-4' for '066.4')
     *
     * 'codes/v1/icd9/:code_name' GET
     *
     * @param $code_name name of code
     */
    public function singleCode($code_name, array $options = array())
    {
        $body = (isset($options['query']) ? $options['query'] : array());
        $body['code_name'] = $code_name;

        $response = $this->client->get('codes/v1/icd9/'.rawurlencode($code_name).'', $body, $options);

        return $response;
    }

    /**
     * Returns all codes whose name contains the search string.
     *
     * 'codes/v1/icd9?q[name_cont]=:query' GET
     *
     * @param $query the search query string
     */
    public function searchByName($query, array $options = array())
    {
        $body = (isset($options['query']) ? $options['query'] : array());
        $body['query'] = $query;

        $response = $this->client->get('codes/v1/icd9?q[name_cont]='.rawurlencode($query).'', $body, $options);

        return $response;
    }

    /**
     * Returns all codes whose description contains the search string.
     *
     * 'codes/v1/icd9?q[description_cont]=:query' GET
     *
     * @param $query the search query string
     */
    public function searchByDescription($query, array $options = array())
    {
        $body = (isset($options['query']) ? $options['query'] : array());
        $body['query'] = $query;

        $response = $this->client->get('codes/v1/icd9?q[description_cont]='.rawurlencode($query).'', $body, $options);

        return $response;
    }

    /**
     * Returns all codes whose name or description contains the search string.
     *
     * 'codes/v1/icd9?q[name_or_description_cont]=:query' GET
     *
     * @param $query the search query string
     */
    public function searchByNameOrDescription($query, array $options = array())
    {
        $body = (isset($options['query']) ? $options['query'] : array());
        $body['query'] = $query;

        $response = $this->client->get('codes/v1/icd9?q[name_or_description_cont]='.rawurlencode($query).'', $body, $options);

        return $response;
    }

}


text:
//: arrays/MultidimensionalPrimitiveArray.java
// Creating multidimensional arrays.
import java.util.*;

public class MultidimensionalPrimitiveArray {
  public static void main(String[] args) {
    int[][] a = {
      { 1, 2, 3, },
      { 4, 5, 6, },
    };
    System.out.println(Arrays.deepToString(a));
  }
} /* Output:
[[1, 2, 3], [4, 5, 6]]
*///:~


text:
@interface LHStackTests : XCTestCase

@end

@implementation LHStackTests

- (void)setUp {
    [super setUp];
    // Put setup code here. This method is called before the invocation of each test method in the class.
}

- (void)tearDown {
    // Put teardown code here. This method is called after the invocation of each test method in the class.
    [super tearDown];
}

- (void)testExample {
    // This is an example of a functional test case.
    LHStack *stack = [LHStack new];
    [stack push:4.5];
    [stack push:3.5];
    [stack push:6.5];
    [stack push:2.5];
    double topNumber = [stack top];
    XCTAssertEqual(topNumber, 2.5, @"topNumber must equal to stack's top value");
    XCTAssertNotNil(stack, @"object must not be nil after init");
}

@end


text: /* This stylesheet is used to style the public view of the plugin. */


text:
.portfolio-header {
  position: relative;
  background-color: #D8D8D8;
  background-image: url(images/header-bg.jpg);
}

.portfolio-header .mdl-layout__header-row {
  padding: 0;
  -webkit-justify-content: center;
      -ms-flex-pack: center;
          justify-content: center;
}

.portfolio-navigation-row {
  background-color: rgba(0, 0, 0, 0.08);
  text-transform: uppercase;
  height: 45px;
}

.portfolio-navigation-row  .mdl-navigation {
  text-align: center;
  max-width: 900px;
  width: 100%;
}

.portfolio-navigation-row .mdl-navigation__link {
  -webkit-flex: 1;
      -ms-flex: 1;
          flex: 1;
  line-height: 42px;
}

.portfolio-header .mdl-layout__drawer-button {
    background-color: rgba(197, 197, 197, 0.44);
}

.portfolio-navigation-row .is-active {
  position: relative;
  font-weight: bold;
}

.portfolio-navigation-row .is-active:after {
  content: "";
  width: 70%;
  height: 2px;
  display: block;
  position: absolute;
  bottom: 0;
  left: 0;
  background-color: rgb(255,64,129);
  left: 15%;
}

img.article-image {
  width: 100%;
  height: auto;
}

.portfolio-max-width {
  max-width: 900px;
  margin: auto;
}

.portfolio-copy {
  max-width: 700px;
}

.portfolio-card .mdl-card__title {
  padding-bottom: 0;
}

.no-padding {
  padding: 0;
}

.no-left-padding{
  padding-left: 0;
}

.no-bottom-padding {
  padding-bottom: 0;
}

.padding-top {
  padding: 10px 0 0;
}

.portfolio-share-btn {
  position: relative;
  float: right;
  top: -4px;
}

.demo-card-event > .mdl-card__actions {
    -webkit-align-items: center;
        -ms-flex-align: center;
            align-items: center;
    box-sizing: border-box;
    display: -webkit-flex;
    display: -ms-flexbox;
    display: flex;
}

.portfolio-contact .mdl-textfield {
  width: 100%;
}

.portfolio-contact form {
  max-width: 700px;
  margin: auto;
}


text:
package app.fav;

import app.util.Path;
import app.util.ViewUtil;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import spark.Request;
import spark.Response;
import spark.Route;

import java.util.HashMap;
import java.util.Map;

/**
 * Created by wrket on 19-Jan-17.
 */
public class favController {

        public static Route fav = (Request request, Response response) -> {
            Map<String, Object> model = new HashMap<>();
            Fav fav = new Fav();
            VelocityContext context = new VelocityContext();

            request.url();

            if (request.queryParams("id") != null && (request.session().attribute("currentUser") !=null ))
            {
                fav.AddFav(request.session().attribute("currentUser"), Integer.valueOf(request.queryParams("id")));
            }
            if (request.queryParams("iddelete") != null && (request.session().attribute("currentUser") !=null ))
            {
                fav.DeleteFav(request.session().attribute("currentUser"), Integer.valueOf(request.queryParams("iddelete")));
            }
           //model.put("url", request.url());
            model.put("fav", fav);
            model.put("request", request);
            model.put("username", request.session().attribute("currentUser"));
            Template template =  null;

            return ViewUtil.render(request, model, Path.Template.FAV);
        };

        public static Route favpost = (Request request, Response response) -> {
            Map<String, Object> model = new HashMap<>();
            VelocityContext context = new VelocityContext();;

            model.put("request", request);

            return ViewUtil.render(request, model, Path.Template.FAV);
        };
    }


text:
* [Unidad 2. Parte 3](https://docs.google.com/presentation/d/1mEKb91_joya0wWqZQ9DkMJH_eSo5aHf2VHSifykKowU/edit?usp=sharing)
* [020454](actividades/020454.md): modificaciones en `better-ticket-machine`

### 9 nov, lunes
* Instalación de [Gobby](https://gobby.github.io/).
* Corrección en clase de [020454](actividades/020454.md)
* [029898](actividades/029898.md): modificaciones en `better-ticket-machine`
* [209078](actividades/209078.md): reloj digital inicial

#### Para casa
* [Abstracción y modularización](http://youtu.be/Xml9__jfC98)
* [Diagrama de objetos VS diagrama de clases](http://youtu.be/C6FM6SeBLXY)
* [Tipos de datos primitivos VS tipos de datos referenciados](http://youtu.be/ukNV9hwJNhY)

### 12 nov, jueves
* Corrección de [209078](actividades/209078.md) (reloj digital inicial)

### 13 nov, viernes
* [0000](actividades/0000.md): implementación de la clase `NumberDisplay`
* [0001](actividades/0001.md): diagramas de clases y objetos en proyecto `house`
* [0002](actividades/0002.md): preguntas varias sobre tipos de datos
* Corrección de [0001](actividades/0001.md) (diagramas de clases y objetos en proyecto `house`)
* Corrección de [0002](actividades/0002.md) (preguntas varias sobre tipos de datos)

#### Para casa
* [Tipos de datos referenciados](documentacion/tiposDeDatosPrimitivos.md)
* Solución para `NumberDisplay`: https://gist.github.com/miguelbayon/78bba85edb6dbb89fb59
* [Revisión de la clase NumberDisplay (I)](http://youtu.be/9BcK7nrjYMA): operadores lógicos
* [Revisión de la clase NumberDisplay (II)](http://youtu.be/67Bq7dhgdFI): concatenación de cadenas
* [Revisión de la clase NumberDisplay (III)](http://youtu.be/STqnDJgP4bI): operador módulo

### 16 nov, lunes
* [0018](actividades/0018.md): implementación de la clase `ClockDisplay`
* [0020](actividades/0020.md): preguntas sobre `ClockDisplay`
* [0021](actividades/0021.md): interacción en CodePad con `NumberDisplay`
* Corrección de [0018](actividades/0018.md) ([implementación]((https://gist.github.com/miguelbayon/34352ec03b7c4ec17a56) de la clase `ClockDisplay`)
* Corrección de [0020](actividades/0020.md) (preguntas sobre `ClockDisplay`)

### 19 nov, jueves
* Corrección de [0021](actividades/0021.md) (interacción en CodePad con `NumberDisplay`)
* [0026](actividades/0026.md) reloj de 12 horas
* [0027](actividades/0027.md) reloj de 12/24 horas elegible

### 20 nov, viernes
* Corrección de [0026](actividades/0026.md) (reloj de 12 horas)
* Corrección de [0027](actividades/0026.md) (reloj de 12/24 horas elegible)
* [0028](https://github.com/miguelbayon/pro015/blob/master/actividades/0028.md): reloj con fecha
* [0022](https://github.com/miguelbayon/pro015/blob/master/actividades/0022.md): pregunta sobre constructores
* [0023](https://github.com/miguelbayon/pro015/blob/master/actividades/0023.md): preguntas sobre constructores
* [0025](https://github.com/miguelbayon/pro015/blob/master/actividades/0025.md): uso del CodePad

#### Para casa
* Solución alternativa a la clase `ClockDisplay` vista en clase: [https://gist.github.com/miguelbayon/be00a3d99d0a66392575](https://gist.github.com/miguelbayon/be00a3d99d0a66392575)
* [Revisión de la clase ClockDisplay](http://youtu.be/9xnWk7KdWEQ): hilo de ejecución de un programa, objetos  creando otros objetos en sus metodos, invocaciones internas y externas, sobrecarga de constructores y métodos e interface de una clase
* [Escenario simplificado del sistema de correo electrónico](http://youtu.be/2TZxZqEQnTc)
* [Clases necesarias para la simulacion del email](http://youtu.be/Yq1AXheoDwQ)

### 23 nov, lunes
* Corrección de [0028](https://github.com/miguelbayon/pro015/blob/master/actividades/0028.md) (reloj con fecha)
* Corrección de [0022](https://github.com/miguelbayon/pro015/blob/master/actividades/0022.md) (pregunta sobre constructores)
* Corrección de [0023](https://github.com/miguelbayon/pro015/blob/master/actividades/0023.md) (preguntas sobre constructores)
* Corrección de [0025](https://github.com/miguelbayon/pro015/blob/master/actividades/0025.md) (uso del CodePad)
* [0029](https://github.com/miguelbayon/pro015/blob/master/actividades/0029.md): interaccion con el sistema de email hecho
* [0030](https://github.com/miguelbayon/pro015/blob/master/actividades/0030.md): implementación de `MailItem` y `MailClient`

### 26 nov, jueves
* Corrección de [0029](https://github.com/miguelbayon/pro015/blob/master/actividades/0029.md) (interacción con el sistema de email hecho)
* Corrección de [0030](https://github.com/miguelbayon/pro015/blob/master/actividades/0030.md) (implementación de `MailItem` y `MailClient`)
* Explicación de `this`.
* [0031](https://github.com/miguelbayon/pro015/blob/master/actividades/0031.md): uso the this y asunto en el email.

#### Para casa
* [Revisión de la solución de 0029](http://youtu.be/U3mMTjcbojA)

### 27 nov, viernes
* [0170](https://github.com/miguelbayon/pro015/blob/master/actividades/0170.md): número de emails, getNextMailItemAndSendAutomaticRespond y visualizar ultimo email.
* Correción de [0031](https://github.com/miguelbayon/pro015/blob/master/actividades/0031.md) (uso the this y asunto en el email)

### 30 nov, lunes
* Corrección de [0170](https://github.com/miguelbayon/pro015/blob/master/actividades/0170.md) (número de emails, `getNextMailItemAndSendAutomaticRespond` y visualizar ultimo email)
* Introducción al uso de clases `Test`.
* [0034](https://github.com/miguelbayon/pro015/blob/master/actividades/0034.md)
* [0009](https://github.com/miguelbayon/pro015/blob/master/actividades/0009.md)
* [0011](https://github.com/miguelbayon/pro015/blob/master/actividades/0011.md)
* [0013](https://github.com/miguelbayon/pro015/blob/master/actividades/0013.md)

#### Para casa
* [Palabra reservada this](http://youtu.be/JkR4IXaSCc8)
* [El depurador o debugger](http://youtu.be/Qg9uFcoaV4I)
* [Función "Step into" del debugger](http://youtu.be/tjvz2UxBJzk)

### 3 dic, jueves
* [0172](https://github.com/miguelbayon/pro015/blob/master/actividades/0172.md) Bebedor

### 4 dic, viernes
* Corrección de [0172](https://github.com/miguelbayon/pro015/blob/master/actividades/0172.md) (Bebedor)
* [0173](https://github.com/miguelbayon/pro015/blob/master/actividades/0173.md) Nueva funcionalidad en bebedor

### 7 dic, lunes
* [0173](https://github.com/miguelbayon/pro015/blob/master/actividades/0173.md) Nueva funcionalidad en bebedor

### 10 dic, jueves
* Comprobación en clase de la [0173](https://github.com/miguelbayon/pro015/blob/master/actividades/0173.md) (nueva funcionalidad en bebedor)

### 11 dic, viernes
* [0150](https://github.com/miguelbayon/pro015/blob/master/actividades/0150.md) Spam, estadísticas y errores en sistema de email

### 14 dic, lunes
* Corrección de  [0150](https://github.com/miguelbayon/pro015/blob/master/actividades/0150.md) (spam, estadísticas y errores en sistema de email)

#### Para casa
* [Introducción a la librería de clases estándar de Java](http://youtu.be/qP7MW41TQKo)
* [Concepto abstractod de "colección](http://youtu.be/E9S90yHBlwA)
* [Introducción a un programa organizador de archivos mp3)](http://youtu.be/DAGgBZArISM)

### 17 dic, jueves
* Corrección de  [0150](https://github.com/miguelbayon/pro015/blob/master/actividades/0150.md) (spam, estadísticas y errores en sistema de email)
* [0032](https://github.com/miguelbayon/pro015/blob/master/actividades/0032.md): usando el debugger

### 18 dic, viernes
* [0035](https://github.com/miguelbayon/pro015/blob/master/actividades/0035.md): empezando con music-organizer
* Revisar la clase `MusicOrganizer` e intentar entender qué hace cada línea del ćodigo.
* [0036](https://github.com/miguelbayon/pro015/blob/master/actividades/0036.md): cuestiones sobre ArrayLists
* [0037](https://github.com/miguelbayon/pro015/blob/master/actividades/0037.md): cuestiones sobre ArrayLists
* [0038](https://github.com/miguelbayon/pro015/blob/master/actividades/0038.md): cuestiones sobre ArrayLists

#### Para casa
* [Solución de 0035](http://youtu.be/u35hIfRjeUw)
* [Revisión de la clase MusicOrganizer](http://youtu.be/-hU1_4LO7Xo)
* A partir de ahora es necesario traer auriculares a clase para poder hacer las actividades.
* [0039](https://github.com/miguelbayon/pro015/blob/master/actividades/0039.md): check y valid index, listFile y removeFile en music-organizer-1

### 21 dic, lunes
* Corrección de [0039](https://github.com/miguelbayon/pro015/blob/master/actividades/0039.md) (check y valid index, listFile y removeFile en music-organizer-1)
* [0289](https://github.com/miguelbayon/pro015/blob/master/actividades/0289.md): alimentos

### 8 ene, viernes
* Corrección de [0289](https://github.com/miguelbayon/pro015/blob/master/actividades/0289.md) (alimentos)
* [0040](https://github.com/miguelbayon/pro015/blob/master/actividades/0040.md): music-organizer-2
* [0290](https://github.com/miguelbayon/pro015/blob/master/actividades/0290.md): alimentos: clase `Usuario`
* [0291](https://github.com/miguelbayon/pro015/blob/master/actividades/0290.md): alimentos: porcentajes

#### Para casa
* [Solución de 0040](http://youtu.be/MEZNpjs515c) (music-organizer-2)
* [Revisión del proyecto `music-organizer-2`:](http://youtu.be/2f5VJzHCa2s)
* [Procesar elementos en una colección](http://youtu.be/4qp17SaIDzI)
* [Ejecución selectiva de operaciones por cada elemento de una colección](http://youtu.be/Zt_0-4xXMZs)

### 11 ene, lunes
* Corrección individual de 0290 y 0291
* [0292](https://github.com/miguelbayon/pro015/blob/master/actividades/0292.md): comparar usuarios en dieta
* [0041](https://github.com/miguelbayon/pro015/blob/master/actividades/0041.md): `listAllFiles` sin bucle
* [0042](https://github.com/miguelbayon/pro015/blob/master/actividades/0042.md): `listAllFiles` en music-organizer-2
* [0043](https://github.com/miguelbayon/pro015/blob/master/actividades/0043.md): `ArrayList` en CodePad
* [0044](https://github.com/miguelbayon/pro015/blob/master/actividades/0044.md): `list-matching` en music-organizer-2

#### Para casa
* [Solución de 0041](http://youtu.be/F66-2ZQrSFs) (`listAllFiles` sin bucle)
* [Solución de 0042](http://youtu.be/F66-2ZQrSFs) (`listAllFiles` en music-organizer-2)
* [Solución de 0043](http://youtu.be/CbxToQ7yeIU) (`ArrayList` en CodePad)
* [Solución de 0044](http://youtu.be/oOSgF-W_zR0) (`list-matching` en music-organizer-2)
* [Numero de iteraciones definidas y no definidas](http://youtu.be/utBtSvByQRU)
* [El bucle while](http://youtu.be/SqQQ7ichrRU)
* [Bucle while VS Bucle for-each](http://youtu.be/sxOYLbtorkQ)
* [Bucle while: buscando en colecciones](http://youtu.be/ArJnwcLW-vk)
* [Bucle while: uso sin colecciones](http://youtu.be/115f9VCP2YQ)

### 14 ene, jueves
* [0293](https://github.com/miguelbayon/pro015/blob/master/actividades/0293.md): alimento más calorico en dieta
* [0045](https://github.com/miguelbayon/pro015/blob/master/actividades/0045.md): cabecera bucle for-each

### 15 ene, viernes
* Corrección de [0293](https://github.com/miguelbayon/pro015/blob/master/actividades/0293.md) (alimento más calorico en dieta)
* [0294](https://github.com/miguelbayon/pro015/blob/master/actividades/0294.md): alimento por posicion en dieta
* Corrección de [0294](https://github.com/miguelbayon/pro015/blob/master/actividades/0294.md) (alimento por posicion en dieta)
* [0295](https://github.com/miguelbayon/pro015/blob/master/actividades/0295.md): alimentos repetidos en dieta

### 18 ene, lunes
* Corrección de [0295](https://github.com/miguelbayon/pro015/blob/master/actividades/0295.md) (alimentos repetidos en dieta)
* [0047](https://github.com/miguelbayon/pro015/blob/master/actividades/0047.md): pseucodigo y bucle while
* [0048](https://github.com/miguelbayon/pro015/blob/master/actividades/0048.md): find-first en music-organizer-2

### 21 ene, jueves
* [0049](https://github.com/miguelbayon/pro015/blob/master/actividades/0049.md): bucles while `Calculadora` 1
* [0051](https://github.com/miguelbayon/pro015/blob/master/actividades/0051.md): music-organizer-5

### 22 ene, viernes
* [0193](https://github.com/miguelbayon/pro015/blob/master/actividades/0193.md): test `Calculadora` 1
* Corrección en clase de [0049](https://github.com/miguelbayon/pro015/blob/master/actividades/0049.md) (bucles while `Calculadora` 1)
* [0194](https://github.com/miguelbayon/pro015/blob/master/actividades/0194.md): bucles while `Calculadora` 2
* [Evaluación de la práctica docente del primer trimestre](https://docs.google.com/a/iessanandres.com/forms/d/1oXW65Q82cwZD3Cz_6uvzclnk-eur5Kfv0cxVob6NStE/viewform)

#### Para casa

* [Solución de 0051](http://youtu.be/KwA1BEYl2f8)
* [Revisión del proyecto music-organizer-v5](http://youtu.be/ftRhTXVzWIU)

### 25 ene. lunes
* Corrección de [0194](https://github.com/miguelbayon/pro015/blob/master/actividades/0194.md) (bucles while `Calculadora` 2) mediante [https://www.refactor.io/q/bd5afc17fd](https://www.refactor.io/q/bd5afc17fd)
* [0195](https://github.com/miguelbayon/pro015/blob/master/actividades/0195.md): bucles while `Calculadora` 3
* [0052](https://github.com/miguelbayon/pro015/blob/master/actividades/0052.md): music-organizer-5
* [0053](https://github.com/miguelbayon/pro015/blob/master/actividades/0053.md): music-organizer-5
* [0054](https://github.com/miguelbayon/pro015/blob/master/actividades/0054.md): music-organizer-5

#### Para casa
* [Iteradores](http://youtu.be/Qsa4CMR9SQI)

### 28 ene, jueves
* [0055](https://github.com/miguelbayon/pro015/blob/master/actividades/0055.md): `listAllTrackWithIterator`, `removeByArtist` y `removeByTitle` en music-organizer-5
* [0057](https://github.com/miguelbayon/pro015/blob/master/actividades/0057.md): `playRandom`, `playShuffle` y `playShuffle2` en music-organizer-5

### 29 ene, viernes
* [Solución a 0055](http://youtu.be/dXiexU9SBRE)
* [Solución a 0057](http://youtu.be/iaWfx9hc8I8)
* [0056](https://github.com/miguelbayon/pro015/blob/master/actividades/0056.md): proyecto `club`
* [0197](https://github.com/miguelbayon/pro015/blob/master/actividades/0197.md): emparejar alumnos

#### Para casa
* [Proyecto Auction](http://youtu.be/QxYKmDYpPsk)

### 1 feb, lunes
* [Solución a 0197](https://github.com/miguelbayon/pro015/blob/master/actividades/0197.md) (emparejar alumnos)
* [0058](https://github.com/miguelbayon/pro015/blob/master/actividades/0058.md): proyecto auction
* [Solución a 0058](http://youtu.be/7s3xt6egv_k)

#### Para casa
* [Palabra reservada null](http://youtu.be/P7zM_3-5CxA)
* [Objetos anónimos](http://youtu.be/c0DRDIagCq8)
* [0059](https://github.com/miguelbayon/pro015/blob/master/actividades/0059.md): objetos anónimos
* [Solución a 0059](http://youtu.be/gdW-X5o2xVQ)
* [Invocaciones de métodos en cadena](http://youtu.be/Etf_5WCzOKg)

### 4 feb, jueves
* [Solución a 0198](https://github.com/miguelbayon/pro015/blob/master/actividades/0198.md) (busquedas en parejas de alumnos)
* [0060](https://github.com/miguelbayon/pro015/blob/master/actividades/0060.md): `close` en auction
* [0061](https://github.com/miguelbayon/pro015/blob/master/actividades/0061.md): `getUnsold`en auction
* [0062](https://github.com/miguelbayon/pro015/blob/master/actividades/0062.md): modificar `getlot` y añadir `removeLot`en auction

### 5 feb, viernes
* Corrección de [0060](https://github.com/miguelbayon/pro015/blob/master/actividades/0060.md) (`close` en auction)
* Corrección de [0061](https://github.com/miguelbayon/pro015/blob/master/actividades/0061.md) (`getUnsold`en auction)
* Explicación en la pizarra de flujo simple de trabajo colaborativo en Github
* [0703](https://github.com/miguelbayon/pro015/blob/master/actividades/0703.md): inicio de juego de cartas por parejas

### 11 feb, jueves
* Corrección de [0703](https://github.com/miguelbayon/pro015/blob/master/actividades/0703.md) (inicio de juego de cartas por parejas)
  *  [Código en Codeshare](https://codeshare.io/Qs8Vt)

#### Para casa
* [Introducción a los arrays](http://youtu.be/eTKe-JpiPEw)
* [Declaración, inicialización y uso de arrays](http://youtu.be/kADN6dgmNi0)
* [Bucle for: introducción](http://youtu.be/L5IzjfYjsjY)
* [Bucle for: estructura](http://youtu.be/Qksp7c01Ssw)
* [Bucle for: uso con arrays](http://youtu.be/vmudvJgZAZM)

### 12 feb, viernes
* Corrección de [0703](https://github.com/miguelbayon/pro015/blob/master/actividades/0703.md) (inicio de juego de cartas por parejas)
  * [Código en Codeshare](https://codeshare.io/Qs8Vt)

### 15 feb, lunes
* [0072](https://github.com/miguelbayon/pro015/blob/master/actividades/0072.md): errores en bucle for
* [0063](https://github.com/miguelbayon/pro015/blob/master/actividades/0063.md): `joinedMonth` y `purge` en club
* Corrección de [0063](https://github.com/miguelbayon/pro015/blob/master/actividades/0063.md): (`joinedMonth` y `purge` en club)
* [0064](https://github.com/miguelbayon/pro015/blob/master/actividades/0064.md): `printProductDetails` en products

### 18 feb, jueves
* [0704](https://github.com/miguelbayon/pro015/blob/master/actividades/0704.md): `findProduct`, `numberInStock` y `delivery` en products
* Corrección de [0704](https://github.com/miguelbayon/pro015/blob/master/actividades/0704.md) (findProduct`, `numberInStock` y `delivery` en products)

### 19 feb, viernes
* [0065](https://github.com/miguelbayon/pro015/blob/master/actividades/0065.md): `underGivenNumberInStock`, `addProduct`  y `findProduct` en products
* Corrección de [0065](https://github.com/miguelbayon/pro015/blob/master/actividades/0065.md) (underGivenNumberInStock`, `addProduct`  y `findProduct` en products)
* [0069](https://github.com/miguelbayon/pro015/blob/master/actividades/0069.md): entendiendo weblog-analyzer
* Corrección de [0069](https://github.com/miguelbayon/pro015/blob/master/actividades/0069.md): entendiendo weblog-analyzer
* [0070](https://github.com/miguelbayon/pro015/blob/master/actividades/0070.md): `printHourlyCounts` y constructor con parámetro en `LogAnalyzer`
* [0073](https://github.com/miguelbayon/pro015/blob/master/actividades/0073.md): `numberOfAccesses` y `busiestHour` en weblog-analyzer

### 22 feb, lunes
* Corrección de [0070](https://github.com/miguelbayon/pro015/blob/master/actividades/0070.md) (`printHourlyCounts` y constructor con parámetro en `LogAnalyzer`)
* Correccion de [0073](https://github.com/miguelbayon/pro015/blob/master/actividades/0073.md) (`numberOfAccesses` y `busiestHour` en weblog-analyzer)
* [0705](https://github.com/miguelbayon/pro015/blob/master/actividades/0705.md): `quietestHour` y dos horas con más carga
* [0074](https://github.com/miguelbayon/pro015/blob/master/actividades/0074.md):  `analyzeDailyData` y `printDailyCounts`

### 25 feb, jueves
* Correción de [0705](https://github.com/miguelbayon/pro015/blob/master/actividades/0705.md): `quietestHour` y dos horas con más carga

### 26 feb, viernes
* Corrección de [0074](https://github.com/miguelbayon/pro015/blob/master/actividades/0074.md):  `analyzeDailyData` y `printDailyCounts`
* [0078](https://github.com/miguelbayon/pro015/blob/master/actividades/0078.md): `ArrayListInt`

#### Para casa
* [Consultar la documentación de una clase en Java](http://youtu.be/ldcycoCb_pA)
* [Documentación de Java 8](http://docs.oracle.com/javase/8/docs/api/)
* [Interfaz vs Implementación](http://youtu.be/fGWWeN10FvM)
* [Clase String: inmutabilidad y métodos](http://youtu.be/e903wIMZQ3Y)
* [Comparación de objetos String](http://youtu.be/-0mM6W9ZMVM)

### 29 feb, lunes
* Corrección de [0078](https://github.com/miguelbayon/pro015/blob/master/actividades/0078.md) (`ArrayListInt`)
* [0076](https://github.com/miguelbayon/pro015/blob/master/actividades/0076.md)
* [0080](https://github.com/miguelbayon/pro015/blob/master/actividades/0080.md)
* [0081](https://github.com/miguelbayon/pro015/blob/master/actividades/0081.md)

#### Para casa
* [Solución a 0081](http://youtu.be/K8Mymy_i9ZA)

### 3 mar, jueves
* Corrección de [0078](https://github.com/miguelbayon/pro015/blob/master/actividades/0078.md) (`ArrayListInt`)
* [0082](https://github.com/miguelbayon/pro015/blob/master/actividades/0082.md)
* [0083](https://github.com/miguelbayon/pro015/blob/master/actividades/0083.md)
* [0084](https://github.com/miguelbayon/pro015/blob/master/actividades/0084.md)
* [0085](https://github.com/miguelbayon/pro015/blob/master/actividades/0085.md)

#### Para casa
* [Solución a 0082](https://www.youtube.com/watch?v=8kkYVBJf92s)
* [Solución a 0083](https://www.youtube.com/watch?v=JZ55r3zTDd4)
* [Solución a 0084](https://www.youtube.com/watch?v=bDzA4g7bqtU)
* [Solución a 0085](https://www.youtube.com/watch?v=oI9ai5Lab7A)

### 4 mar, viernes
* [0086](https://github.com/miguelbayon/pro015/blob/master/actividades/0086.md): respuestas aleatorias en support-system
* [Leer documentación de clases genéricas o parametrizadas](http://youtu.be/AOzisqVXdtM)
* [Importación de paquetes](http://youtu.be/FmQiQ_P5JTE)
* [Solución a 0086](http://youtu.be/kmhjosBg2PY) (respuestas aleatorias en support-system)
* [0088](https://github.com/miguelbayon/pro015/blob/master/actividades/0088.md): investigando la clase `HashMap`
* [Mapas y clase Hashmap](http://youtu.be/QhdMIxpvcfk)
* [0089](https://github.com/miguelbayon/pro015/blob/master/actividades/0089.md): agenda telefónica

#### Para casa
* [0090](https://github.com/miguelbayon/pro015/blob/master/actividades/0090.md): preguntas sobre la clase `HashMap`
* [0091](https://github.com/miguelbayon/pro015/blob/master/actividades/0091.md): `printAllKeys` en agenda telefonica
* [Solución a 0089](http://youtu.be/rVrpTZTccJQ)
* [Solución a 0090](http://youtu.be/cU8VxsHWAYc)
* [Solución a 0091](http://youtu.be/nZolHYAi4xc)

### 7 mar, lunes
* [0092](https://github.com/miguelbayon/pro015/blob/master/actividades/0092.md): respuestas en support-system por palabras clave
* [0735](https://github.com/miguelbayon/pro015/blob/master/actividades/0735.md): clase `HashMapInt`

#### Para casa
* [Conjuntos y clase HashSet](http://youtu.be/PVmnj7S7C7s)
* [Documentación de clases](http://youtu.be/WxkR0DHlpFc)
* [Público vs privado](http://youtu.be/SR56ILDCkXQ)

### 10 mar, jueves
* [Solución a 0092](https://youtu.be/zsvfwjPXRN0)
* [0093](https://github.com/miguelbayon/pro015/blob/master/actividades/0093.md): metodo `split`

### 11 mar, viernes
* [0094](https://github.com/miguelbayon/pro015/blob/master/actividades/0094.md): `inputReader` devuelve un conjunto
* [0095](https://github.com/miguelbayon/pro015/blob/master/actividades/0095.md): `generateResponse` contesta a una palabra del conjunto
* [0096](https://github.com/miguelbayon/pro015/blob/master/actividades/0096.md): `generateResponse` contesta a un conjunto de palabras
* [Solución a 0093](https://youtu.be/KLwAHlVuG-A)
* [Solución a 0094](https://youtu.be/8Gavn1EuLBs)
* [Solución a 0095](https://youtu.be/SPnB9BiIuPA)
* [Solución a 0096](https://youtu.be/GoSK1xo24x8)
* Corrección de 0735 usando [`TestMiHashMap`](https://gist.github.com/miguelbayon/5052fd89dcb53b46bdb8)

### 14 mar, lunes
* [0096](https://github.com/miguelbayon/pro015/blob/master/actividades/0096.md): clase `MiHashSet`
* Corrección de [0096]((https://github.com/miguelbayon/pro015/blob/master/actividades/0096.md) (clase `MiHashSet`)
* [0098](https://github.com/miguelbayon/pro015/blob/master/actividades/0098.md): proyecto `scribble`
* [0099](https://github.com/miguelbayon/pro015/blob/master/actividades/0098.md): añadir métodos de dibujo al proyecto `scribble`

#### Para casa
* [Autocompletado de código](http://youtu.be/jWS3W9xBHzQ)
* [Solución a 0099](http://youtu.be/Hr7kDzT_VqQ)

### 17 mar, jueves
* [0100](https://github.com/miguelbayon/pro015/blob/master/actividades/0100.md)

### 18 mar, viernes
* Corrección de [0079](https://github.com/miguelbayon/pro015/blob/master/actividades/0079.md)
  * [Pagina en Codeshare](https://codeshare.io/6qTZN)

### 31 mar, jueves
* [0101](https://github.com/miguelbayon/pro015/blob/master/actividades/0101.md)

#### Para casa
* [Variables estáticas o de clase](http://youtu.be/Qi1ptpKHx2w)
* [Constantes](http://youtu.be/p4M68fEQrTY)
* [Solución 0100](http://youtu.be/b-jLKZBH5Ek)

### 1 abr, viernes
* [0102](https://github.com/miguelbayon/pro015/blob/master/actividades/0102.md)
* Corrección de [0101](https://github.com/miguelbayon/pro015/blob/master/actividades/0101.md)
* [0104](https://github.com/miguelbayon/pro015/blob/master/actividades/0104.md)
* [0105](https://github.com/miguelbayon/pro015/blob/master/actividades/0105.md)
* [0071](https://github.com/miguelbayon/pro015/blob/master/actividades/0071.md)

### 4 abr, lunes
* [0071](https://github.com/miguelbayon/pro015/blob/master/actividades/0071.md)
* [0692](https://github.com/miguelbayon/pro015/blob/master/actividades/0692.md): `drawSnake` en `SnakeGame`

### 5 abr, martes
* Correción de [0692](https://github.com/miguelbayon/pro015/blob/master/actividades/0692.md): `drawSnake` en `SnakeGame`

### 7 abr, jueves
* [0693](https://github.com/miguelbayon/pro015/blob/master/actividades/0693.md): `animateSnake` y `startGame` en `SnakeGame`

#### Para casa
* [Introducción al diseño de clases](http://youtu.be/E0lg9DqObR0)
* [Introducción al acoplamiento y la cohesión](http://youtu.be/sOAFiBrIkZ8)
* [Repetición de código](http://youtu.be/SBkyofBiR6E)

### 8 abr, viernes
* [0106](https://github.com/miguelbayon/pro015/blob/master/actividades/0106.md): mapa del juego original
* [0107](https://github.com/miguelbayon/pro015/blob/master/actividades/0107.md): mapa propio e implementación

### 11 abr, lunes
* [0108](https://github.com/miguelbayon/pro015/blob/master/actividades/0108.md): eliminada reptición de código
* [0109](https://github.com/miguelbayon/pro015/blob/master/actividades/0109.md): proyecto `cities-visited`
* [0110](https://github.com/miguelbayon/pro015/blob/master/actividades/0110.md): añadida dirección de salida sureste
* [0111](https://github.com/miguelbayon/pro015/blob/master/actividades/0111.md): encapsulamiento en clase `Room`
* [0112](https://github.com/miguelbayon/pro015/blob/master/actividades/0112.md): usando un `hashMap` para las salidas
* [0113](https://github.com/miguelbayon/pro015/blob/master/actividades/0113.md): cualquier direccion de salida es posible
* [0114](https://github.com/miguelbayon/pro015/blob/master/actividades/0114.md): `getLongDescription` y responsability driven design

### 14 abr, jueves
* [Solución a la actividad 0107](http://youtu.be/Y-L2oKbAiNg)
* [Solución a la actividad 0108](http://youtu.be/hcoMgZl12iM)
* [Solución a la actividad 0109](http://youtu.be/70rLuGytmpY)
* [Solución a la actividad 0110](http://youtu.be/pqZN7Q1qS0c)
* [Solución a la actividad 0111](http://youtu.be/iUSkit4wFmA)
* [Solución a la actividad 0112](http://youtu.be/UE3PZpDYUB4)
* [Solución a la actividad 0113](http://youtu.be/Q9avK8OEdWo)
* [Solución a la actividad 0114](http://youtu.be/J5OJ4fDj65w)
* [0115](https://github.com/miguelbayon/pro015/blob/master/actividades/0115.md): comando `look`
* [0116](https://github.com/miguelbayon/pro015/blob/master/actividades/0116.md): 2 opciones para mostrar comandos disponibles
* [0117](https://github.com/miguelbayon/pro015/blob/master/actividades/0117.md): posibilidad de un item por localizacion

### 15 abr, viernes
* Carrera Solidaria
* [Solución a la actividad 0115](http://youtu.be/NN-9pnL-jzA)
* [Solución a la actividad 0116](http://youtu.be/Pt7imt9G7i8)
* [Solución a la actividad 0117](http://youtu.be/brQnl1z23ww)

### 18 abr, lunes
* [0118](https://github.com/miguelbayon/pro015/blob/master/actividades/0118.md): multiples o ningún objeto en las localizaciones
* [0119](https://github.com/miguelbayon/pro015/blob/master/actividades/0119.md): comando `back`
* [Ramas en git](http://youtu.be/a59Apqn1csE)
* [Refactorización](http://youtu.be/H1jkhnroGqA)
* [0120](https://github.com/miguelbayon/pro015/blob/master/actividades/0120.md): refactorizacion: añadida clase `Player`

### 21 abr, jueves
* [0121](https://github.com/miguelbayon/pro015/blob/master/actividades/0121.md)

### 22 abr, viernes
* Visita a Proconsi

### 25 abr, lunes
* [0122](https://github.com/miguelbayon/pro015/blob/master/actividades/0122.md)
* [0123](https://github.com/miguelbayon/pro015/blob/master/actividades/0123.md)
* [0124](https://github.com/miguelbayon/pro015/blob/master/actividades/0124.md)

### 28 abr, jueves
* [0125](https://github.com/miguelbayon/pro015/blob/master/actividades/0125.md): 2 funcionalidades propias

### 29 abr, viernes

### 2 may, lunes
* Fiesta del día del trabajo

### 5 may, jueves
* Correciones en clase de [0120](https://github.com/miguelbayon/pro015/blob/master/actividades/0120.md) (refactorizacion: añadida clase `Player`)

### 6 may, viernes
* Sin clase: excursión con 1º ESO al Centro de Alto Rendimiento

#### Para casa
* [Métodos estáticos](http://youtu.be/OpCUHNDGdBQ)

### 9 may, lunes
* [0126](https://github.com/miguelbayon/pro015/blob/master/actividades/0126.md)
* [0127]( https://github.com/miguelbayon/pro015/blob/master/actividades/0127.md)
* [0128](https://github.com/miguelbayon/pro015/blob/master/actividades/0128.md)

### 12 may, jueves
* Herencia (hora 01)
* Herencia (hora 02)

### 13 may, viernes
* Herencia (hora 03)
* Herencia (hora 04)
* Herencia (hora 05)

### 16 may, lunes
* Herencia (hora 06)
 * [0666](https://github.com/miguelbayon/pro015/blob/master/actividades/0666.md)
 * Corrección de [0666](https://github.com/miguelbayon/pro015/blob/master/actividades/0666.md)
* Herencia (hora 07)
* Herencia (hora 08)

### 19 may, jueves
* Herencia (hora 09)
* Herencia (hora 10)

### 20 may, viernes
* Herencia (hora 11)
* Herencia (hora 12)

### 23 may, lunes
* Herencia (hora 13)
* Herencia (hora 14)
* Herencia (hora 15)

### 26 may, jueves
* Herencia (hora 16)
* Herencia (hora 17)

## 27 may, viernes

## 30 may, lunes
* Corrección de [0134](https://github.com/miguelbayon/pro015/blob/master/actividades/0134.md)
* Test en Java con JUnit sobre Bluej
* [0135](https://github.com/miguelbayon/pro015/blob/master/actividades/0135.md)

## 2 jun, jueves


text:
'use strict';

module.exports = function (N, apiPath) {

  N.validate(apiPath, {
    sid: { type: 'string', required: true, pattern: /^[0-9a-f]+/ }
  });

  N.wire.on(apiPath, async function app_post(env) {
    let sl;

    try {
      sl = await N.shortlinks.get(env.params.sid, { valueEncoding: 'json' });
    } catch (err) {
      // if session id (shortlink) not found - return 404
      if (err.type === 'NotFoundError') throw N.io.NOT_FOUND;

      throw err;
    }

    let params = { config: sl.config };

    // build font
    await N.wire.emit('internal:fontello.font_build', params);

    // reuse `fontello.font.download` method
    env.params.id = params.fontId;
    await N.wire.emit('server:fontello.font.download', env);
  });
};