app-studio 0.6.56 → 0.6.58
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/app-studio.cjs.development.js +136 -33
- package/dist/app-studio.cjs.development.js.map +1 -1
- package/dist/app-studio.cjs.production.min.js +1 -1
- package/dist/app-studio.esm.js +135 -34
- package/dist/app-studio.esm.js.map +1 -1
- package/dist/app-studio.umd.development.js +136 -33
- package/dist/app-studio.umd.development.js.map +1 -1
- package/dist/app-studio.umd.production.min.js +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/providers/WindowSize.d.ts +0 -4
- package/docs/README.md +2 -2
- package/package.json +1 -1
|
@@ -1375,6 +1375,33 @@ const debounce = (func, wait) => {
|
|
|
1375
1375
|
timeout = setTimeout(() => func(...args), wait);
|
|
1376
1376
|
};
|
|
1377
1377
|
};
|
|
1378
|
+
// Helper to compute breakpoint from width
|
|
1379
|
+
const getBreakpointFromWidth = (width, breakpoints) => {
|
|
1380
|
+
// console.log('[ResponsiveProvider] Computing breakpoint for width:', width);
|
|
1381
|
+
// console.log('[ResponsiveProvider] Breakpoints config:', breakpoints);
|
|
1382
|
+
const sortedBreakpoints = Object.entries(breakpoints).sort((_ref, _ref2) => {
|
|
1383
|
+
let [, a] = _ref;
|
|
1384
|
+
let [, b] = _ref2;
|
|
1385
|
+
return b - a;
|
|
1386
|
+
}); // Sort descending by min value
|
|
1387
|
+
// console.log('[ResponsiveProvider] Sorted breakpoints:', sortedBreakpoints);
|
|
1388
|
+
for (const [name, minWidth] of sortedBreakpoints) {
|
|
1389
|
+
if (width >= minWidth) {
|
|
1390
|
+
// console.log(
|
|
1391
|
+
// '[ResponsiveProvider] ✓ Match found:',
|
|
1392
|
+
// name,
|
|
1393
|
+
// 'for width',
|
|
1394
|
+
// width,
|
|
1395
|
+
// '>= minWidth',
|
|
1396
|
+
// minWidth
|
|
1397
|
+
// );
|
|
1398
|
+
return name;
|
|
1399
|
+
}
|
|
1400
|
+
}
|
|
1401
|
+
const fallback = sortedBreakpoints[sortedBreakpoints.length - 1]?.[0] || 'xs';
|
|
1402
|
+
// console.log('[ResponsiveProvider] No match, using fallback:', fallback);
|
|
1403
|
+
return fallback;
|
|
1404
|
+
};
|
|
1378
1405
|
// Create the Context with default values
|
|
1379
1406
|
const ResponsiveContext = /*#__PURE__*/React.createContext({
|
|
1380
1407
|
breakpoints: defaultBreakpointsConfig,
|
|
@@ -1388,41 +1415,83 @@ const ResponsiveContext = /*#__PURE__*/React.createContext({
|
|
|
1388
1415
|
});
|
|
1389
1416
|
// Custom Hook to Access the Responsive Context
|
|
1390
1417
|
const useResponsiveContext = () => React.useContext(ResponsiveContext);
|
|
1391
|
-
const ResponsiveProvider =
|
|
1418
|
+
const ResponsiveProvider = _ref3 => {
|
|
1392
1419
|
let {
|
|
1393
1420
|
breakpoints = defaultBreakpointsConfig,
|
|
1394
1421
|
devices = defaultDeviceConfig,
|
|
1395
1422
|
children
|
|
1396
|
-
} =
|
|
1397
|
-
const [screen, setScreen] = React.useState(
|
|
1423
|
+
} = _ref3;
|
|
1424
|
+
const [screen, setScreen] = React.useState(() => {
|
|
1425
|
+
// Initialize with correct breakpoint instead of hardcoded 'xs'
|
|
1426
|
+
if (typeof window !== 'undefined') {
|
|
1427
|
+
return getBreakpointFromWidth(window.innerWidth, breakpoints);
|
|
1428
|
+
}
|
|
1429
|
+
return 'xs';
|
|
1430
|
+
});
|
|
1398
1431
|
const [orientation, setOrientation] = React.useState('portrait');
|
|
1432
|
+
const [size, setSize] = React.useState({
|
|
1433
|
+
width: typeof window !== 'undefined' ? window.innerWidth : 0,
|
|
1434
|
+
height: typeof window !== 'undefined' ? window.innerHeight : 0
|
|
1435
|
+
});
|
|
1399
1436
|
const mediaQueries = React.useMemo(() => getMediaQueries(breakpoints), [breakpoints]);
|
|
1400
1437
|
React.useEffect(() => {
|
|
1401
|
-
|
|
1402
|
-
|
|
1403
|
-
|
|
1404
|
-
|
|
1405
|
-
|
|
1406
|
-
|
|
1407
|
-
|
|
1408
|
-
|
|
1438
|
+
// console.log('[ResponsiveProvider] useEffect running - initial setup');
|
|
1439
|
+
// Set initial screen size immediately based on window width
|
|
1440
|
+
const initialScreen = getBreakpointFromWidth(window.innerWidth, breakpoints);
|
|
1441
|
+
// console.log(
|
|
1442
|
+
// '[ResponsiveProvider] Setting initial screen to:',
|
|
1443
|
+
// initialScreen
|
|
1444
|
+
// );
|
|
1445
|
+
setScreen(initialScreen);
|
|
1446
|
+
const handleResize = () => {
|
|
1447
|
+
const newWidth = window.innerWidth;
|
|
1448
|
+
const newHeight = window.innerHeight;
|
|
1449
|
+
// console.log('[ResponsiveProvider] Resize event - new dimensions:', {
|
|
1450
|
+
// width: newWidth,
|
|
1451
|
+
// height: newHeight,
|
|
1452
|
+
// });
|
|
1453
|
+
setSize({
|
|
1454
|
+
width: newWidth,
|
|
1455
|
+
height: newHeight
|
|
1456
|
+
});
|
|
1457
|
+
// Update screen on resize
|
|
1458
|
+
const newScreen = getBreakpointFromWidth(newWidth, breakpoints);
|
|
1459
|
+
// console.log('[ResponsiveProvider] Setting screen to:', newScreen);
|
|
1460
|
+
setScreen(newScreen);
|
|
1461
|
+
};
|
|
1462
|
+
const debouncedResize = debounce(handleResize, 100);
|
|
1463
|
+
window.addEventListener('resize', debouncedResize);
|
|
1464
|
+
// Set up orientation listener
|
|
1409
1465
|
const orientationMql = window.matchMedia('(orientation: landscape)');
|
|
1410
1466
|
const onOrientationChange = () => setOrientation(orientationMql.matches ? 'landscape' : 'portrait');
|
|
1411
|
-
orientationMql.
|
|
1467
|
+
if (orientationMql.addEventListener) {
|
|
1468
|
+
orientationMql.addEventListener('change', onOrientationChange);
|
|
1469
|
+
} else {
|
|
1470
|
+
orientationMql.addListener(onOrientationChange);
|
|
1471
|
+
}
|
|
1412
1472
|
onOrientationChange();
|
|
1413
|
-
|
|
1414
|
-
|
|
1415
|
-
|
|
1416
|
-
|
|
1417
|
-
|
|
1418
|
-
|
|
1419
|
-
|
|
1420
|
-
|
|
1421
|
-
|
|
1422
|
-
|
|
1423
|
-
|
|
1424
|
-
|
|
1425
|
-
|
|
1473
|
+
return () => {
|
|
1474
|
+
window.removeEventListener('resize', debouncedResize);
|
|
1475
|
+
if (orientationMql.removeEventListener) {
|
|
1476
|
+
orientationMql.removeEventListener('change', onOrientationChange);
|
|
1477
|
+
} else {
|
|
1478
|
+
orientationMql.removeListener(onOrientationChange);
|
|
1479
|
+
}
|
|
1480
|
+
};
|
|
1481
|
+
}, [breakpoints]); // Removed mediaQueries dep since we now use direct width comparison
|
|
1482
|
+
const value = React.useMemo(() => {
|
|
1483
|
+
const contextValue = {
|
|
1484
|
+
breakpoints,
|
|
1485
|
+
devices,
|
|
1486
|
+
mediaQueries,
|
|
1487
|
+
currentWidth: size.width,
|
|
1488
|
+
currentHeight: size.height,
|
|
1489
|
+
currentBreakpoint: screen,
|
|
1490
|
+
currentDevice: determineCurrentDevice(screen, devices),
|
|
1491
|
+
orientation
|
|
1492
|
+
};
|
|
1493
|
+
return contextValue;
|
|
1494
|
+
}, [breakpoints, devices, mediaQueries, size, screen, orientation]);
|
|
1426
1495
|
return /*#__PURE__*/React__default.createElement(ResponsiveContext.Provider, {
|
|
1427
1496
|
value: value
|
|
1428
1497
|
}, children);
|
|
@@ -2598,7 +2667,7 @@ const extractUtilityClasses = (props, getColor, mediaQueries, devices, manager)
|
|
|
2598
2667
|
if (props.blend === true) {
|
|
2599
2668
|
setBlend(props, computedStyles);
|
|
2600
2669
|
Object.keys(props).forEach(property => {
|
|
2601
|
-
if (props[property]?.color === undefined && property.startsWith('_')
|
|
2670
|
+
if (props[property]?.color === undefined && (property.startsWith('_') || property === 'on' || property === 'media')) {
|
|
2602
2671
|
setBlend(props[property], props[property]);
|
|
2603
2672
|
}
|
|
2604
2673
|
});
|
|
@@ -2737,7 +2806,13 @@ const Element = /*#__PURE__*/React__default.memo(/*#__PURE__*/React.forwardRef((
|
|
|
2737
2806
|
} = props;
|
|
2738
2807
|
let blend = initialBlend;
|
|
2739
2808
|
if (blend !== false && props.color === undefined && typeof props.children === 'string' && (as === 'span' || as === 'div' || as === 'sub' || as === 'sup')) {
|
|
2740
|
-
|
|
2809
|
+
const otherMediaProps = {
|
|
2810
|
+
...(props.on || {}),
|
|
2811
|
+
...(props.media || {})
|
|
2812
|
+
};
|
|
2813
|
+
if (otherMediaProps.color === undefined) {
|
|
2814
|
+
blend = true;
|
|
2815
|
+
}
|
|
2741
2816
|
}
|
|
2742
2817
|
const elementRef = React.useRef(null);
|
|
2743
2818
|
const setRef = React.useCallback(node => {
|
|
@@ -2763,6 +2838,10 @@ const Element = /*#__PURE__*/React__default.memo(/*#__PURE__*/React.forwardRef((
|
|
|
2763
2838
|
manager
|
|
2764
2839
|
} = useStyleRegistry();
|
|
2765
2840
|
const [isVisible, setIsVisible] = React.useState(false);
|
|
2841
|
+
console.log({
|
|
2842
|
+
mediaQueries,
|
|
2843
|
+
devices
|
|
2844
|
+
});
|
|
2766
2845
|
React.useEffect(() => {
|
|
2767
2846
|
if (!animateIn) {
|
|
2768
2847
|
setIsVisible(true);
|
|
@@ -4748,6 +4827,31 @@ function isMobile() {
|
|
|
4748
4827
|
return navigator.userAgent.match(/(iPhone|iPod|Android|ios|iPad)/i);
|
|
4749
4828
|
}
|
|
4750
4829
|
|
|
4830
|
+
const WindowSizeContext = /*#__PURE__*/React.createContext({
|
|
4831
|
+
width: 0,
|
|
4832
|
+
height: 0
|
|
4833
|
+
});
|
|
4834
|
+
const WindowSizeProvider = _ref => {
|
|
4835
|
+
let {
|
|
4836
|
+
children
|
|
4837
|
+
} = _ref;
|
|
4838
|
+
const [size, setSize] = React.useState({
|
|
4839
|
+
width: window.innerWidth,
|
|
4840
|
+
height: window.innerHeight
|
|
4841
|
+
});
|
|
4842
|
+
React.useEffect(() => {
|
|
4843
|
+
const handleResize = () => setSize({
|
|
4844
|
+
width: window.innerWidth,
|
|
4845
|
+
height: window.innerHeight
|
|
4846
|
+
});
|
|
4847
|
+
window.addEventListener('resize', handleResize);
|
|
4848
|
+
return () => window.removeEventListener('resize', handleResize);
|
|
4849
|
+
}, []);
|
|
4850
|
+
return /*#__PURE__*/React__default.createElement(WindowSizeContext.Provider, {
|
|
4851
|
+
value: size
|
|
4852
|
+
}, children);
|
|
4853
|
+
};
|
|
4854
|
+
|
|
4751
4855
|
function useActive() {
|
|
4752
4856
|
const [active, setActive] = React.useState(false);
|
|
4753
4857
|
const ref = React.useRef(null);
|
|
@@ -4999,13 +5103,15 @@ const useResponsive = () => {
|
|
|
4999
5103
|
devices
|
|
5000
5104
|
} = context;
|
|
5001
5105
|
const on = s => devices[s] ? devices[s].includes(screen) : s === screen;
|
|
5002
|
-
|
|
5106
|
+
const result = {
|
|
5003
5107
|
...context,
|
|
5004
5108
|
screen,
|
|
5005
5109
|
orientation,
|
|
5006
5110
|
on,
|
|
5007
5111
|
is: on
|
|
5008
5112
|
};
|
|
5113
|
+
// console.log('[useResponsive] Hook called, returning:', { screen, orientation, 'on(mobile)': on('mobile') });
|
|
5114
|
+
return result;
|
|
5009
5115
|
};
|
|
5010
5116
|
|
|
5011
5117
|
// Helper to check if element is a Window object (works across iframes)
|
|
@@ -5287,11 +5393,6 @@ const useScrollDirection = function (threshold) {
|
|
|
5287
5393
|
return scrollDirection;
|
|
5288
5394
|
};
|
|
5289
5395
|
|
|
5290
|
-
const WindowSizeContext = /*#__PURE__*/React.createContext({
|
|
5291
|
-
width: 0,
|
|
5292
|
-
height: 0
|
|
5293
|
-
});
|
|
5294
|
-
|
|
5295
5396
|
const useWindowSize = () => React.useContext(WindowSizeContext);
|
|
5296
5397
|
|
|
5297
5398
|
function useInView(options) {
|
|
@@ -5928,6 +6029,8 @@ exports.UtilityClassManager = UtilityClassManager;
|
|
|
5928
6029
|
exports.Vertical = Vertical;
|
|
5929
6030
|
exports.VerticalResponsive = VerticalResponsive;
|
|
5930
6031
|
exports.View = View;
|
|
6032
|
+
exports.WindowSizeContext = WindowSizeContext;
|
|
6033
|
+
exports.WindowSizeProvider = WindowSizeProvider;
|
|
5931
6034
|
exports.animateOnView = animateOnView;
|
|
5932
6035
|
exports.blurInOnView = blurInOnView;
|
|
5933
6036
|
exports.blurOutOnView = blurOutOnView;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app-studio.cjs.development.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"app-studio.cjs.development.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|