@easepick/amp-plugin
Advanced tools
Comparing version 1.1.2 to 1.1.3
@@ -1,166 +0,1 @@ | ||
import { BasePlugin } from '@easepick/base-plugin'; | ||
import { DateTime } from '@easepick/datetime'; | ||
class AmpPlugin extends BasePlugin { | ||
rangePlugin; | ||
lockPlugin; | ||
priority = 10; | ||
binds = { | ||
onView: this.onView.bind(this), | ||
}; | ||
options = { | ||
dropdown: { | ||
minYear: 1950, | ||
}, | ||
locale: { | ||
resetButton: `<svg xmlns="http://www.w3.org/2000/svg" height="24" width="24"><path d="M13 3c-4.97 0-9 4.03-9 9H1l3.89 3.89.07.14L9 12H6c0-3.87 3.13-7 7-7s7 3.13 7 7-3.13 7-7 7c-1.93 0-3.68-.79-4.94-2.06l-1.42 1.42C8.27 19.99 10.51 21 13 21c4.97 0 9-4.03 9-9s-4.03-9-9-9zm-1 5v5l4.28 2.54.72-1.21-3.5-2.08V8H12z"/></svg>` | ||
}, | ||
}; | ||
/** | ||
* Returns plugin name | ||
* | ||
* @returns String | ||
*/ | ||
getName() { | ||
return 'AmpPlugin'; | ||
} | ||
/** | ||
* - Called automatically via BasePlugin.attach() - | ||
* The function execute on initialize the picker | ||
*/ | ||
onAttach() { | ||
this.picker.on('view', this.binds.onView); | ||
} | ||
/** | ||
* - Called automatically via BasePlugin.detach() - | ||
*/ | ||
onDetach() { | ||
this.picker.off('view', this.binds.onView); | ||
} | ||
/** | ||
* Function `view` event | ||
* Adds `tabIndex` to the picker elements | ||
* | ||
* @param event | ||
*/ | ||
onView(event) { | ||
this.lockPlugin = this.picker.PluginManager.getInstance('LockPlugin'); | ||
this.rangePlugin = this.picker.PluginManager.getInstance('RangePlugin'); | ||
this.handleDropdown(event); | ||
this.handleResetButton(event); | ||
} | ||
/** | ||
* | ||
* @param evt | ||
*/ | ||
handleDropdown(evt) { | ||
const { view, target, date, index } = evt.detail; | ||
if (view === 'CalendarHeader') { | ||
const monthNameWrapper = target.querySelector('.month-name'); | ||
if (this.options.dropdown.months) { | ||
monthNameWrapper.childNodes[0].remove(); | ||
const selectMonths = document.createElement('select'); | ||
selectMonths.className = 'month-name--select month-name--dropdown'; | ||
for (let x = 0; x < 12; x += 1) { | ||
const option = document.createElement('option'); | ||
// day 2 due to iOS bug (?) with `toLocaleString` | ||
const monthName = new DateTime(new Date(date.getFullYear(), x, 2, 0, 0, 0)); | ||
const optionMonth = new DateTime(new Date(date.getFullYear(), x, 1, 0, 0, 0)); | ||
option.value = String(x); | ||
option.text = monthName.toLocaleString(this.picker.options.lang, { month: 'long' }); | ||
if (this.lockPlugin) { | ||
option.disabled = (this.lockPlugin.options.minDate | ||
&& optionMonth.isBefore(new DateTime(this.lockPlugin.options.minDate), 'month')) | ||
|| (this.lockPlugin.options.maxDate && optionMonth.isAfter(new DateTime(this.lockPlugin.options.maxDate), 'month')); | ||
} | ||
option.selected = optionMonth.getMonth() === date.getMonth(); | ||
selectMonths.appendChild(option); | ||
} | ||
selectMonths.addEventListener('change', (e) => { | ||
const target = e.target; | ||
this.picker.calendars[0].setDate(1); | ||
this.picker.calendars[0].setMonth(Number(target.value)); | ||
this.picker.renderAll(); | ||
}); | ||
monthNameWrapper.prepend(selectMonths); | ||
} | ||
if (this.options.dropdown.years) { | ||
monthNameWrapper.childNodes[1].remove(); | ||
const selectYears = document.createElement('select'); | ||
selectYears.className = 'month-name--select'; | ||
const minYear = this.options.dropdown.minYear; | ||
const maxYear = this.options.dropdown.maxYear ? this.options.dropdown.maxYear : (new Date()).getFullYear(); | ||
if (date.getFullYear() > maxYear) { | ||
const option = document.createElement('option'); | ||
option.value = String(date.getFullYear()); | ||
option.text = String(date.getFullYear()); | ||
option.selected = true; | ||
option.disabled = true; | ||
selectYears.appendChild(option); | ||
} | ||
for (let x = maxYear; x >= minYear; x -= 1) { | ||
const option = document.createElement('option'); | ||
const optionYear = new DateTime(new Date(x, 0, 1, 0, 0, 0)); | ||
option.value = String(x); | ||
option.text = String(x); | ||
if (this.lockPlugin) { | ||
option.disabled = (this.lockPlugin.options.minDate | ||
&& optionYear.isBefore(new DateTime(this.lockPlugin.options.minDate), 'year')) | ||
|| (this.lockPlugin.options.maxDate | ||
&& optionYear.isAfter(new DateTime(this.lockPlugin.options.maxDate), 'year')); | ||
} | ||
option.selected = date.getFullYear() === x; | ||
selectYears.appendChild(option); | ||
} | ||
if (date.getFullYear() < minYear) { | ||
const option = document.createElement('option'); | ||
option.value = String(date.getFullYear()); | ||
option.text = String(date.getFullYear()); | ||
option.selected = true; | ||
option.disabled = true; | ||
selectYears.appendChild(option); | ||
} | ||
if (this.options.dropdown.years === 'asc') { | ||
const childs = Array.prototype.slice.call(selectYears.childNodes); | ||
const options = childs.reverse(); | ||
selectYears.innerHTML = ''; | ||
options.forEach((y) => { | ||
y.innerHTML = y.value; | ||
selectYears.appendChild(y); | ||
}); | ||
} | ||
selectYears.addEventListener('change', (e) => { | ||
const target = e.target; | ||
this.picker.calendars[0].setFullYear(Number(target.value)); | ||
this.picker.renderAll(); | ||
}); | ||
monthNameWrapper.appendChild(selectYears); | ||
} | ||
} | ||
} | ||
/** | ||
* | ||
* @param event | ||
*/ | ||
handleResetButton(event) { | ||
const { view, target } = event.detail; | ||
if (view === 'CalendarHeader' && this.options.resetButton) { | ||
const button = document.createElement('button'); | ||
button.className = 'reset-button unit'; | ||
button.innerHTML = this.options.locale.resetButton; | ||
button.addEventListener('click', (evt) => { | ||
evt.preventDefault(); | ||
let shouldReset = true; | ||
if (typeof this.options.resetButton === 'function') { | ||
shouldReset = this.options.resetButton.call(this); | ||
} | ||
if (shouldReset) { | ||
this.picker.clear(); | ||
} | ||
}); | ||
target.appendChild(button); | ||
} | ||
} | ||
} | ||
export { AmpPlugin }; | ||
import{BasePlugin as e}from"@easepick/base-plugin";import{DateTime as t}from"@easepick/datetime";class n extends e{rangePlugin;lockPlugin;priority=10;binds={onView:this.onView.bind(this)};options={dropdown:{minYear:1950},locale:{resetButton:'<svg xmlns="http://www.w3.org/2000/svg" height="24" width="24"><path d="M13 3c-4.97 0-9 4.03-9 9H1l3.89 3.89.07.14L9 12H6c0-3.87 3.13-7 7-7s7 3.13 7 7-3.13 7-7 7c-1.93 0-3.68-.79-4.94-2.06l-1.42 1.42C8.27 19.99 10.51 21 13 21c4.97 0 9-4.03 9-9s-4.03-9-9-9zm-1 5v5l4.28 2.54.72-1.21-3.5-2.08V8H12z"/></svg>'}};getName(){return"AmpPlugin"}onAttach(){this.picker.on("view",this.binds.onView)}onDetach(){this.picker.off("view",this.binds.onView)}onView(e){this.lockPlugin=this.picker.PluginManager.getInstance("LockPlugin"),this.rangePlugin=this.picker.PluginManager.getInstance("RangePlugin"),this.handleDropdown(e),this.handleResetButton(e)}handleDropdown(e){const{view:n,target:i,date:o,index:s}=e.detail;if("CalendarHeader"===n){const e=i.querySelector(".month-name");if(this.options.dropdown.months){e.childNodes[0].remove();const n=document.createElement("select");n.className="month-name--select month-name--dropdown";for(let e=0;e<12;e+=1){const i=document.createElement("option"),s=new t(new Date(o.getFullYear(),e,2,0,0,0)),l=new t(new Date(o.getFullYear(),e,1,0,0,0));i.value=String(e),i.text=s.toLocaleString(this.picker.options.lang,{month:"long"}),this.lockPlugin&&(i.disabled=this.lockPlugin.options.minDate&&l.isBefore(new t(this.lockPlugin.options.minDate),"month")||this.lockPlugin.options.maxDate&&l.isAfter(new t(this.lockPlugin.options.maxDate),"month")),i.selected=l.getMonth()===o.getMonth(),n.appendChild(i)}n.addEventListener("change",(e=>{const t=e.target;this.picker.calendars[0].setDate(1),this.picker.calendars[0].setMonth(Number(t.value)),this.picker.renderAll()})),e.prepend(n)}if(this.options.dropdown.years){e.childNodes[1].remove();const n=document.createElement("select");n.className="month-name--select";const i=this.options.dropdown.minYear,s=this.options.dropdown.maxYear?this.options.dropdown.maxYear:(new Date).getFullYear();if(o.getFullYear()>s){const e=document.createElement("option");e.value=String(o.getFullYear()),e.text=String(o.getFullYear()),e.selected=!0,e.disabled=!0,n.appendChild(e)}for(let e=s;e>=i;e-=1){const i=document.createElement("option"),s=new t(new Date(e,0,1,0,0,0));i.value=String(e),i.text=String(e),this.lockPlugin&&(i.disabled=this.lockPlugin.options.minDate&&s.isBefore(new t(this.lockPlugin.options.minDate),"year")||this.lockPlugin.options.maxDate&&s.isAfter(new t(this.lockPlugin.options.maxDate),"year")),i.selected=o.getFullYear()===e,n.appendChild(i)}if(o.getFullYear()<i){const e=document.createElement("option");e.value=String(o.getFullYear()),e.text=String(o.getFullYear()),e.selected=!0,e.disabled=!0,n.appendChild(e)}if("asc"===this.options.dropdown.years){const e=Array.prototype.slice.call(n.childNodes).reverse();n.innerHTML="",e.forEach((e=>{e.innerHTML=e.value,n.appendChild(e)}))}n.addEventListener("change",(e=>{const t=e.target;this.picker.calendars[0].setFullYear(Number(t.value)),this.picker.renderAll()})),e.appendChild(n)}}}handleResetButton(e){const{view:t,target:n}=e.detail;if("CalendarHeader"===t&&this.options.resetButton){const e=document.createElement("button");e.className="reset-button unit",e.innerHTML=this.options.locale.resetButton,e.addEventListener("click",(e=>{e.preventDefault();let t=!0;"function"==typeof this.options.resetButton&&(t=this.options.resetButton.call(this)),t&&this.picker.clear()})),n.appendChild(e)}}}export{n as AmpPlugin}; |
/** | ||
* @license | ||
* Package: @easepick/amp-plugin | ||
* Version: 1.1.0 | ||
* Version: 1.1.3 | ||
* https://easepick.com/ | ||
@@ -10,174 +10,2 @@ * Copyright 2022 Rinat G. | ||
*/ | ||
(function (global, factory) { | ||
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@easepick/base-plugin'), require('@easepick/datetime')) : | ||
typeof define === 'function' && define.amd ? define(['exports', '@easepick/base-plugin', '@easepick/datetime'], factory) : | ||
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.easepick = global.easepick || {}, global.easepick, global.easepick)); | ||
})(this, (function (exports, basePlugin, datetime) { 'use strict'; | ||
class AmpPlugin extends basePlugin.BasePlugin { | ||
rangePlugin; | ||
lockPlugin; | ||
priority = 10; | ||
binds = { | ||
onView: this.onView.bind(this), | ||
}; | ||
options = { | ||
dropdown: { | ||
minYear: 1950, | ||
}, | ||
locale: { | ||
resetButton: `<svg xmlns="http://www.w3.org/2000/svg" height="24" width="24"><path d="M13 3c-4.97 0-9 4.03-9 9H1l3.89 3.89.07.14L9 12H6c0-3.87 3.13-7 7-7s7 3.13 7 7-3.13 7-7 7c-1.93 0-3.68-.79-4.94-2.06l-1.42 1.42C8.27 19.99 10.51 21 13 21c4.97 0 9-4.03 9-9s-4.03-9-9-9zm-1 5v5l4.28 2.54.72-1.21-3.5-2.08V8H12z"/></svg>` | ||
}, | ||
}; | ||
/** | ||
* Returns plugin name | ||
* | ||
* @returns String | ||
*/ | ||
getName() { | ||
return 'AmpPlugin'; | ||
} | ||
/** | ||
* - Called automatically via BasePlugin.attach() - | ||
* The function execute on initialize the picker | ||
*/ | ||
onAttach() { | ||
this.picker.on('view', this.binds.onView); | ||
} | ||
/** | ||
* - Called automatically via BasePlugin.detach() - | ||
*/ | ||
onDetach() { | ||
this.picker.off('view', this.binds.onView); | ||
} | ||
/** | ||
* Function `view` event | ||
* Adds `tabIndex` to the picker elements | ||
* | ||
* @param event | ||
*/ | ||
onView(event) { | ||
this.lockPlugin = this.picker.PluginManager.getInstance('LockPlugin'); | ||
this.rangePlugin = this.picker.PluginManager.getInstance('RangePlugin'); | ||
this.handleDropdown(event); | ||
this.handleResetButton(event); | ||
} | ||
/** | ||
* | ||
* @param evt | ||
*/ | ||
handleDropdown(evt) { | ||
const { view, target, date, index } = evt.detail; | ||
if (view === 'CalendarHeader') { | ||
const monthNameWrapper = target.querySelector('.month-name'); | ||
if (this.options.dropdown.months) { | ||
monthNameWrapper.childNodes[0].remove(); | ||
const selectMonths = document.createElement('select'); | ||
selectMonths.className = 'month-name--select month-name--dropdown'; | ||
for (let x = 0; x < 12; x += 1) { | ||
const option = document.createElement('option'); | ||
// day 2 due to iOS bug (?) with `toLocaleString` | ||
const monthName = new datetime.DateTime(new Date(date.getFullYear(), x, 2, 0, 0, 0)); | ||
const optionMonth = new datetime.DateTime(new Date(date.getFullYear(), x, 1, 0, 0, 0)); | ||
option.value = String(x); | ||
option.text = monthName.toLocaleString(this.picker.options.lang, { month: 'long' }); | ||
if (this.lockPlugin) { | ||
option.disabled = (this.lockPlugin.options.minDate | ||
&& optionMonth.isBefore(new datetime.DateTime(this.lockPlugin.options.minDate), 'month')) | ||
|| (this.lockPlugin.options.maxDate && optionMonth.isAfter(new datetime.DateTime(this.lockPlugin.options.maxDate), 'month')); | ||
} | ||
option.selected = optionMonth.getMonth() === date.getMonth(); | ||
selectMonths.appendChild(option); | ||
} | ||
selectMonths.addEventListener('change', (e) => { | ||
const target = e.target; | ||
this.picker.calendars[0].setDate(1); | ||
this.picker.calendars[0].setMonth(Number(target.value)); | ||
this.picker.renderAll(); | ||
}); | ||
monthNameWrapper.prepend(selectMonths); | ||
} | ||
if (this.options.dropdown.years) { | ||
monthNameWrapper.childNodes[1].remove(); | ||
const selectYears = document.createElement('select'); | ||
selectYears.className = 'month-name--select'; | ||
const minYear = this.options.dropdown.minYear; | ||
const maxYear = this.options.dropdown.maxYear ? this.options.dropdown.maxYear : (new Date()).getFullYear(); | ||
if (date.getFullYear() > maxYear) { | ||
const option = document.createElement('option'); | ||
option.value = String(date.getFullYear()); | ||
option.text = String(date.getFullYear()); | ||
option.selected = true; | ||
option.disabled = true; | ||
selectYears.appendChild(option); | ||
} | ||
for (let x = maxYear; x >= minYear; x -= 1) { | ||
const option = document.createElement('option'); | ||
const optionYear = new datetime.DateTime(new Date(x, 0, 1, 0, 0, 0)); | ||
option.value = String(x); | ||
option.text = String(x); | ||
if (this.lockPlugin) { | ||
option.disabled = (this.lockPlugin.options.minDate | ||
&& optionYear.isBefore(new datetime.DateTime(this.lockPlugin.options.minDate), 'year')) | ||
|| (this.lockPlugin.options.maxDate | ||
&& optionYear.isAfter(new datetime.DateTime(this.lockPlugin.options.maxDate), 'year')); | ||
} | ||
option.selected = date.getFullYear() === x; | ||
selectYears.appendChild(option); | ||
} | ||
if (date.getFullYear() < minYear) { | ||
const option = document.createElement('option'); | ||
option.value = String(date.getFullYear()); | ||
option.text = String(date.getFullYear()); | ||
option.selected = true; | ||
option.disabled = true; | ||
selectYears.appendChild(option); | ||
} | ||
if (this.options.dropdown.years === 'asc') { | ||
const childs = Array.prototype.slice.call(selectYears.childNodes); | ||
const options = childs.reverse(); | ||
selectYears.innerHTML = ''; | ||
options.forEach((y) => { | ||
y.innerHTML = y.value; | ||
selectYears.appendChild(y); | ||
}); | ||
} | ||
selectYears.addEventListener('change', (e) => { | ||
const target = e.target; | ||
this.picker.calendars[0].setFullYear(Number(target.value)); | ||
this.picker.renderAll(); | ||
}); | ||
monthNameWrapper.appendChild(selectYears); | ||
} | ||
} | ||
} | ||
/** | ||
* | ||
* @param event | ||
*/ | ||
handleResetButton(event) { | ||
const { view, target } = event.detail; | ||
if (view === 'CalendarHeader' && this.options.resetButton) { | ||
const button = document.createElement('button'); | ||
button.className = 'reset-button unit'; | ||
button.innerHTML = this.options.locale.resetButton; | ||
button.addEventListener('click', (evt) => { | ||
evt.preventDefault(); | ||
let shouldReset = true; | ||
if (typeof this.options.resetButton === 'function') { | ||
shouldReset = this.options.resetButton.call(this); | ||
} | ||
if (shouldReset) { | ||
this.picker.clear(); | ||
} | ||
}); | ||
target.appendChild(button); | ||
} | ||
} | ||
} | ||
exports.AmpPlugin = AmpPlugin; | ||
Object.defineProperty(exports, '__esModule', { value: true }); | ||
})); | ||
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("@easepick/base-plugin"),require("@easepick/datetime")):"function"==typeof define&&define.amd?define(["exports","@easepick/base-plugin","@easepick/datetime"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).easepick=e.easepick||{},e.easepick,e.easepick)}(this,(function(e,t,n){"use strict";class i extends t.BasePlugin{rangePlugin;lockPlugin;priority=10;binds={onView:this.onView.bind(this)};options={dropdown:{minYear:1950},locale:{resetButton:'<svg xmlns="http://www.w3.org/2000/svg" height="24" width="24"><path d="M13 3c-4.97 0-9 4.03-9 9H1l3.89 3.89.07.14L9 12H6c0-3.87 3.13-7 7-7s7 3.13 7 7-3.13 7-7 7c-1.93 0-3.68-.79-4.94-2.06l-1.42 1.42C8.27 19.99 10.51 21 13 21c4.97 0 9-4.03 9-9s-4.03-9-9-9zm-1 5v5l4.28 2.54.72-1.21-3.5-2.08V8H12z"/></svg>'}};getName(){return"AmpPlugin"}onAttach(){this.picker.on("view",this.binds.onView)}onDetach(){this.picker.off("view",this.binds.onView)}onView(e){this.lockPlugin=this.picker.PluginManager.getInstance("LockPlugin"),this.rangePlugin=this.picker.PluginManager.getInstance("RangePlugin"),this.handleDropdown(e),this.handleResetButton(e)}handleDropdown(e){const{view:t,target:i,date:o,index:s}=e.detail;if("CalendarHeader"===t){const e=i.querySelector(".month-name");if(this.options.dropdown.months){e.childNodes[0].remove();const t=document.createElement("select");t.className="month-name--select month-name--dropdown";for(let e=0;e<12;e+=1){const i=document.createElement("option"),s=new n.DateTime(new Date(o.getFullYear(),e,2,0,0,0)),a=new n.DateTime(new Date(o.getFullYear(),e,1,0,0,0));i.value=String(e),i.text=s.toLocaleString(this.picker.options.lang,{month:"long"}),this.lockPlugin&&(i.disabled=this.lockPlugin.options.minDate&&a.isBefore(new n.DateTime(this.lockPlugin.options.minDate),"month")||this.lockPlugin.options.maxDate&&a.isAfter(new n.DateTime(this.lockPlugin.options.maxDate),"month")),i.selected=a.getMonth()===o.getMonth(),t.appendChild(i)}t.addEventListener("change",(e=>{const t=e.target;this.picker.calendars[0].setDate(1),this.picker.calendars[0].setMonth(Number(t.value)),this.picker.renderAll()})),e.prepend(t)}if(this.options.dropdown.years){e.childNodes[1].remove();const t=document.createElement("select");t.className="month-name--select";const i=this.options.dropdown.minYear,s=this.options.dropdown.maxYear?this.options.dropdown.maxYear:(new Date).getFullYear();if(o.getFullYear()>s){const e=document.createElement("option");e.value=String(o.getFullYear()),e.text=String(o.getFullYear()),e.selected=!0,e.disabled=!0,t.appendChild(e)}for(let e=s;e>=i;e-=1){const i=document.createElement("option"),s=new n.DateTime(new Date(e,0,1,0,0,0));i.value=String(e),i.text=String(e),this.lockPlugin&&(i.disabled=this.lockPlugin.options.minDate&&s.isBefore(new n.DateTime(this.lockPlugin.options.minDate),"year")||this.lockPlugin.options.maxDate&&s.isAfter(new n.DateTime(this.lockPlugin.options.maxDate),"year")),i.selected=o.getFullYear()===e,t.appendChild(i)}if(o.getFullYear()<i){const e=document.createElement("option");e.value=String(o.getFullYear()),e.text=String(o.getFullYear()),e.selected=!0,e.disabled=!0,t.appendChild(e)}if("asc"===this.options.dropdown.years){const e=Array.prototype.slice.call(t.childNodes).reverse();t.innerHTML="",e.forEach((e=>{e.innerHTML=e.value,t.appendChild(e)}))}t.addEventListener("change",(e=>{const t=e.target;this.picker.calendars[0].setFullYear(Number(t.value)),this.picker.renderAll()})),e.appendChild(t)}}}handleResetButton(e){const{view:t,target:n}=e.detail;if("CalendarHeader"===t&&this.options.resetButton){const e=document.createElement("button");e.className="reset-button unit",e.innerHTML=this.options.locale.resetButton,e.addEventListener("click",(e=>{e.preventDefault();let t=!0;"function"==typeof this.options.resetButton&&(t=this.options.resetButton.call(this)),t&&this.picker.clear()})),n.appendChild(e)}}}e.AmpPlugin=i,Object.defineProperty(e,"__esModule",{value:!0})})); |
{ | ||
"name": "@easepick/amp-plugin", | ||
"description": "Plugin for easepick.", | ||
"version": "1.1.2", | ||
"version": "1.1.3", | ||
"main": "dist/index.umd.js", | ||
@@ -6,0 +6,0 @@ "module": "dist/index.esm.js", |
Sorry, the diff of this file is not supported yet
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
Minified code
QualityThis package contains minified code. This may be harmless in some cases where minified code is included in packaged libraries, however packages on npm should not minify code.
Found 1 instance in 1 package
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
10819
103
2